有没有简单的方法将[1,2,3,4,5,6,7,8,9]
转换为[[1,2,3],[4,5,6],[7,8,9]]
,而不需要明确使用for
循环?
>>> x = [1,2,3,4,5,6,7,8,9]
>>> zip(*[iter(x)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
x=[1,2,3,4,5,6,7]
测试它,那么您只会得到两个块,并且数字7
将被丢弃。(当然,如果这是您想要的结果,那就没问题,但如果不是,请小心!) - gimboland1
或 N
(列表中的项目数)块,或者是 N 的某个因子。对于这个问题没有一个特定的最佳数字,如果需要,可以根据个人喜好来考虑该数字。 - jamylakIn [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]]
你也可以在这里使用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]])
>>> map(None,*[iter(s)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
map(None, *[iter(range(10))]*3)
和zip(*[iter(range(10))]*3)
的结果。由于OP没有指定想要哪种行为,这个答案是有效的。 - senderleizip_longest
。这也是itertools
示例中使用的。 - jamylakfrom 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]))