我希望这个问题不是重复的;我发现了类似的但不完全符合我的需要。
我想要一种有效的方法将列表拆分为 n 子列表,其中每个索引转到不同的列表,直到我们到达 nth 索引,然后是下一个 n 索引以相同的顺序转到我们已有的列表,依此类推......
例如,给出以下列表:
l = [1,1,1,2,2,2,3,3,3]
n = 3
在这种情况下,我需要将列表拆分为3个具有所需输出的列表:
[[1,2,3],[1,2,3],[1,2,3]]
我可以使用 n 来跳过每个 nth 步骤的循环,但我确信有更好的方法。
答案 0 :(得分:3)
使用zip
和列表理解
l = [1,1,1,2,2,2,3,3,3]
n = 3
print([list(i) for i in zip(*[l[i:i+n] for i in range(0, len(l), n)])])
<强>输出:强>
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
注意:如果块不均匀,您还可以使用from itertools import izip_longest
。
答案 1 :(得分:1)
对于您描述的循环方法,请参阅How do you split a list into evenly sized chunks?
better way将使用第三方库,例如numpy
。这利用了矢量化计算:
示例#1
import numpy as np
l = np.array([1,1,1,2,2,2,3,3,3])
n = 3
res = l.reshape((len(l)/n), n).T
print(res)
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
示例#2
import numpy as np
l = np.array([1,2,3,4,5,6,7,8])
n = 4
res = l.reshape((len(l)/n, n)).T
print(res)
array([[1, 5],
[2, 6],
[3, 7],
[4, 8]])
答案 2 :(得分:0)
我找到了另一个答案,非常简单,使用modulo:
l = [1,2,3,4,5,6,7,8]
n = 4
for i in range (n):
a.append([])
for i in range(len(l)):
a[i%n].append(l[i])
输出:
[[1, 5], [2, 6], [3, 7], [4, 8]]