【问题标题】:Split a list into n items in a sublist with remainder being added [closed]将列表拆分为子列表中的 n 个项目,并添加剩余部分 [关闭]
【发布时间】:2014-01-08 21:05:46
【问题描述】:

我昨晚问了这个问题,但我的措辞很糟糕。 我正在尝试列出以下内容:

['milk','eggs','beef','oranges','dog food','chips','soda','bread']

并将其拆分为每个n 的列表,任何余数都需要均匀地添加到列表中。所以结果将是n = 3

[['milk','eggs','beef'],['oranges','dog food','chips']]

余数为:['soda','bread'],最终结果为:

[['milk','eggs','beef','soda'],['oranges','dog food','chips','bread']]

顺序无关紧要。

【问题讨论】:

  • 如果你有十个元素,n=3,你会怎么做?余数是一个元素,因此不能均匀地添加到所有列表中。
  • 那么最好将它添加到任何列表中。
  • 马修,您的帖子似乎缺少一个问题。您有什么具体问题需要我们为您解答吗?
  • 编写一个可以接收上述列表并像这样拆分返回它们的函数的最佳方法是什么?

标签: python list split subset


【解决方案1】:

一个简短但有效的解决方案:

def splitList (lst, n):
    it = iter(lst)
    new = [[next(it) for _ in range(n)] for _ in range(len(lst) // n)]

    for i, x in enumerate(it):
        new[i].append(x)

    return new
>>> lst = ['milk', 'eggs', 'beef', 'oranges', 'dog food', 'chips', 'soda', 'bread']
>>> splitList(lst, 3)
[['milk', 'eggs', 'beef', 'soda'], ['oranges', 'dog food', 'chips', 'bread']]
>>> splitList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3)
[[1, 2, 3, 10], [4, 5, 6], [7, 8, 9]]

这首先创建了一个迭代器,我们将其用于所有内容;所以总的来说我们只在列表上循环一次。将创建的子列表数量为len(lst) // n(整数除法向下舍入),对于每个子列表,我们从迭代器中获取n 值。

之后,剩余的项仍会留在迭代器中,因此我们可以简单地遍历剩余的项并直接将它们附加到子列表中。

【讨论】:

    【解决方案2】:

    对于列表a,您可以通过floor(len(a) / n)获取最小长度n的组数。

    def split(a, minSize):
        numGroups = int(len(a) / minSize)
        return [a[i::numGroups] for i in range(numGroups)]
    

    【讨论】:

    • @poke 我以为他说“顺序无关紧要”
    • 哦!我没看到,对不起!
    【解决方案3】:

    我相信下面的代码非常简单,可以很好地为您服务。 请注意,它需要 more_itertools 模块

    from more_itertools import chunked
    
    x = ['milk','eggs','beef','oranges','dog food','chips','soda','bread']
    
    def foo(lst,num):
        chunk = list(chunked(lst,num))
    
        if len(chunk[-1]) == num:
            return chunk
    
        for i,val in enumerate(chunk[-1]):
            chunk[i].append(val)
        del chunk[-1]
    
        return chunk
    
    ans = foo(x,3)
    # [['milk', 'eggs', 'beef', 'soda'], ['oranges', 'dog food', 'chips', 'bread']]
    

    代码使用来自 more_itertools 的分块方法将您的列表分解为大小为 n 的子列表(在您的示例 3 中),其余部分在最终子列表中。然后我遍历这个最终的子列表并将其元素附加到您现有的子列表中。然后删除最终的子列表。

    【讨论】:

    • y 来自哪里?
    • 对不起,我把变量名从 y 改成了 chunk,忘记了最后一个,现在编辑。
    【解决方案4】:

    试试这个:

    def split_list(lst, n):
        result = []
        # split off elements in groups of `n`
        i = 0
        while i+n <= len(lst):
            result.append([])
            for k in range(n):
                result[-1].append(lst[i+k])
            i += n
        # add the remainder to the groups
        j = 0
        while i < len(lst):
            result[j].append(lst[i])
            i += 1
            j += 1
            j %= len(result)
        return result
    
    lst = ['milk','eggs','beef','oranges','dog food','chips','soda','bread']
    for i in range(1, len(lst)):
        print(i, split_list(lst, i))
    

    结果:

    1 [['milk'], ['eggs'], ['beef'], ['oranges'], ['dog food'], ['chips'], ['soda'], ['bread']]
    2 [['milk', 'eggs'], ['beef', 'oranges'], ['dog food', 'chips'], ['soda', 'bread']]
    3 [['milk', 'eggs', 'beef', 'soda'], ['oranges', 'dog food', 'chips', 'bread']]
    4 [['milk', 'eggs', 'beef', 'oranges'], ['dog food', 'chips', 'soda', 'bread']]
    5 [['milk', 'eggs', 'beef', 'oranges', 'dog food', 'chips', 'soda', 'bread']]
    6 [['milk', 'eggs', 'beef', 'oranges', 'dog food', 'chips', 'soda', 'bread']]
    7 [['milk', 'eggs', 'beef', 'oranges', 'dog food', 'chips', 'soda', 'bread']]
    

    不过,这样做有点奇怪,所以我想知道您是否可能没有从错误的角度解决您的问题。

    【讨论】:

      【解决方案5】:

      像上面那样可能会短一些

      def Matts_list( l, n ):
          return_list = [ l[i:i + n] for i in range( 0, len( l ), n ) ]
          # last list isn't n long
          if len( return_list[-1] ) != n :
              last = return_list.pop()
              for i in range( 0, len( last ) ):
                  return_list[i % len( return_list )].append( last[i] )
          return return_list
      

      【讨论】:

        【解决方案6】:

        我已尽力回答您的问题。对于要添加的列表的其余部分,我仍然有点不清楚,所以这可能需要在某个时候进行修改。 请告诉我以下功能是否能满足您的目的。

        groceryList = ['milk', 'eggs', 'beef', 'oranges', 'dog food', 'chips', 'soda', 'bread']
        outlist = []
        listLength = len(groceryList)
        modulus = listLength // 3
        remainder = listLength % 3
        print listLength, modulus, remainder
        ending = 0
        while modulus >= 1:
            outlist.append(groceryList[ending:ending+3])
            ending += 3
            modulus -= 1
        
        print "value of ending", ending
        outlistcounter = 0
        if remainder > 0:
            while remainder != 0:
                outlist[outlistcounter].extend(groceryList[ending:ending+1])
                outlistcounter += 1
                remainder -= 1
                ending += 1
        print outlist
        

        【讨论】:

          【解决方案7】:

          这适用于您似乎要求的内容:

          def f(x, n):
          
              if n > len(x):
                  return
          
              y = [x[i: i + n] for i in range(0, len(x), n)]  #split the list up into lists by n
          
              if len(y[-1]) != n:  #if there is a remainder
                  remainder = y[-1]   
                  y = y[:-1]
          
                  count = 0
                  while remainder:  #while remainder is not an empty list
                      for lst in y:
                          lst.append(remainder.pop())  #pop the remaining items into each of the other lists 
                          count += 1
              return y
          

          示例输出:

          myList =['milk','eggs','beef','oranges','dog food','chips','soda','bread']
          
          print f(myList, 3)
          
          [['milk', 'eggs', 'beef', 'bread'], ['oranges', 'dog food', 'chips', 'soda']]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-14
            • 1970-01-01
            • 2020-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多