【问题标题】:Splitting a list into N parts of approximately equal length将列表拆分为长度大致相等的 N 部分
【发布时间】:2011-01-08 22:58:09
【问题描述】:

将列表分成大致等份的最佳方法是什么?例如,如果列表有 7 个元素并将其拆分为 2 个部分,我们希望在一个部分中获取 3 个元素,而另一个应该有 4 个元素。

我正在寻找类似even_split(L, n) 的东西,它将L 分解为n 部分。

def chunks(L, n):
    """ Yield successive n-sized chunks from L.
    """
    for i in range(0, len(L), n):
        yield L[i:i+n]

上面的代码给出了 3 个块,而不是 3 个块。我可以简单地转置(迭代这个并获取每列的第一个元素,调用该部分,然后获取第二个并将其放入第二部分,等等),但这会破坏项目的顺序。

【问题讨论】:

    标签: python list chunks


    【解决方案1】:
    def chunk_array(array : List, n: int) -> List[List]:
        chunk_size = len(array) // n 
        chunks = []
        i = 0
        while i < len(array):
            # if less than chunk_size left add the remainder to last element
            if len(array) - (i + chunk_size + 1) < 0:
                chunks[-1].append(*array[i:i + chunk_size])
                break
            else:
                chunks.append(array[i:i + chunk_size])
                i += chunk_size
        return chunks
    

    这是我的版本(灵感来自 Max 的)

    【讨论】:

      【解决方案2】:
      n = len(lst)
      # p is the number of parts to be divided
      x = int(n/p)
      
      i = 0
      j = x
      lstt = []
      while (i< len(lst) or j <len(lst)):
          lstt.append(lst[i:j])
          i+=x
          j+=x
      print(lstt)
      

      如果知道列表分成相等的部分,这是最简单的答案。

      【讨论】:

        【解决方案3】:

        如果你不介意顺序会发生变化,我建议你使用@job解决方案,否则你可以使用这个:

        def chunkIt(seq, num):
            steps = int(len(seq) / float(num))
            out = []
            last = 0.0
        
            while last < len(seq):
                if len(seq) - (last + steps) < steps:
                    until = len(seq)
                    steps = len(seq) - last
                else:
                    until = int(last + steps)
                out.append(seq[int(last): until])
                last += steps
        return out
        

        【讨论】:

          【解决方案4】:

          又一次尝试简单易读的分块器。

          def chunk(iterable, count): # returns a *generator* that divides `iterable` into `count` of contiguous chunks of similar size
              assert count >= 1
              return (iterable[int(_*len(iterable)/count+0.5):int((_+1)*len(iterable)/count+0.5)] for _ in range(count))
          
          print("Chunk count:  ", len(list(         chunk(range(105),10))))
          print("Chunks:       ",     list(         chunk(range(105),10)))
          print("Chunks:       ",     list(map(list,chunk(range(105),10))))
          print("Chunk lengths:",     list(map(len, chunk(range(105),10))))
          
          print("Testing...")
          for iterable_length in range(100):
              for chunk_count in range(1,100):
                  chunks = list(chunk(range(iterable_length),chunk_count))
                  assert chunk_count == len(chunks)
                  assert iterable_length == sum(map(len,chunks))
                  assert all(map(lambda _:abs(len(_)-iterable_length/chunk_count)<=1,chunks))
          print("Okay")
          

          输出:

          Chunk count:   10
          Chunks:        [range(0, 11), range(11, 21), range(21, 32), range(32, 42), range(42, 53), range(53, 63), range(63, 74), range(74, 84), range(84, 95), range(95, 105)]
          Chunks:        [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], [32, 33, 34, 35, 36, 37, 38, 39, 40, 41], [42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], [53, 54, 55, 56, 57, 58, 59, 60, 61, 62], [63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73], [74, 75, 76, 77, 78, 79, 80, 81, 82, 83], [84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94], [95, 96, 97, 98, 99, 100, 101, 102, 103, 104]]
          Chunk lengths: [11, 10, 11, 10, 11, 10, 11, 10, 11, 10]
          Testing...
          Okay
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-04
            • 1970-01-01
            相关资源
            最近更新 更多