【问题标题】:How to split python list into chunks of equal size? [duplicate]如何将python列表分成大小相等的块? [复制]
【发布时间】:2012-05-09 00:20:02
【问题描述】:

可能重复:
How do you split a list into evenly sized chunks in Python?
python: convert “5,4,2,4,1,0” into [[5, 4], [2, 4], [1, 0]]

[1,2,3,4,5,6,7,8,9]

->

[[1,2,3],[4,5,6],[7,8,9]]

有没有明确的'for'的简单方法?

【问题讨论】:

  • 如果列表中的项目数不能被块大小整除怎么办?
  • 这是asked before

标签: python list


【解决方案1】:
>>> x = [1,2,3,4,5,6,7,8,9]
>>> zip(*[iter(x)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

How does zip(*[iter(s)]*n) work in Python?

【讨论】:

  • 也解释一下:P
  • 前面已经解释过了,但是我会找到一个链接。
  • 这非常聪明,但我猜它是pythonic。
  • 请注意,这会丢弃不完整的块。如果您尝试使用x = [1,2,3,4,5,6,7],那么您只会得到两个块,而7 将被丢弃。 (当然,这可能是您想要的,但如果不是,请小心!)
  • @gimboland 输入无效,因为没有可能的 even
【解决方案2】:

如果你真的希望子元素是列表 vs 元组:

In [9]: [list(t) for t in zip(*[iter(range(1,10))]*3)]
Out[9]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

或者,如果您想包含将被zip 截断的剩余元素,请使用切片语法:

In [16]: l=range(14)

In [17]: [l[i:i+3] for i in range(0,len(l),3)]
Out[17]: [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]]

【讨论】:

  • 这个版本不会丢弃“剩余的”剩余部分,所以这是我的选择。
【解决方案3】:

您也可以在这里使用numpy.reshape

import numpy as np

x = np.array([1,2,3,4,5,6,7,8,9])

new_x = np.reshape(x, (3,3))

结果:

>>> new_x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

【讨论】:

  • 看起来很干净 ;) 但是……为了这个目的,将整个 numpy 添加到项目中 ;)
【解决方案4】:
>>> map(None,*[iter(s)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

【讨论】:

  • 这似乎是我的代码的可读性较差的版本...
  • 这个确切的代码在 jamylak 帖子的链接中接受的答案中提供。
  • 我想知道它有效但我不建议使用它,因为我之前说过。
  • @jamylak,实际上,这与您的代码所做的略有不同。查看map(None, *[iter(range(10))]*3))zip(*[iter(range(10))]*3) 的结果。由于 OP 没有指定他或她想要哪种行为,所以这个答案是有效的。
  • @senderle 我会使用izip_longest。这也用于itertools 的示例中
【解决方案5】:

下面是一种不太“聪明”的递归方式:

from itertools import chain

def groupsof(n, xs):
    if len(xs) < n:
        return [xs]
    else:
        return chain([xs[0:n]], groupsof(n, xs[n:]))

print list(groupsof(3, [1,2,3,4,5,6,7,8,9,10,11,12,13]))

【讨论】:

    猜你喜欢
    • 2022-10-29
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2022-01-20
    相关资源
    最近更新 更多