嘿我试图生成列表的子列表。例如,我有一个这样的列表:
l = [1,2,3,4,5,6,7,8,9,10,11,12]
我想将它们拆分为长度为4的子列表。但是第一个元素与前一个列表中的最后一个元素相同,就像我说它必须具有4的长度一样。像这样:
l1 = [1,2,3,4]
l2 = [4,5,6,7]
l3 = [7,8,9,10]
l4 = [10, 11, 12] <-- should be ignored
有人有想法吗?!我正在考虑一台发电机,但我不太确定。
答案 0 :(得分:4)
a = []
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
for i in range(0, len(l)-3, 3):
a.append(l[i:i+4])
将提供a = [[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]
或者你可以用作列表理解:
[l[i:i+4] for i in range(0, len(l)-3, 3)]
答案 1 :(得分:4)
简单但灵活的生成器实现:
def overlapping_sublists(l, n, overlap=1, start=0):
while start <= len(l) - n:
yield l[start:start+n]
start += n - overlap
使用示例:
>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> list(overlapping_sublists(l, 4))
[[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]
>>> list(overlapping_sublists(l, 4, 2, 3))
[[4, 5, 6, 7], [6, 7, 8, 9], [8, 9, 10, 11]]
答案 2 :(得分:3)
print([l[i:i+4] for i in range(0, len(l), 3)])
输出:
[[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10], [10, 11, 12]]
仅限长度为4的子列表:
print([m for m in [l[i:i+4] for i in range(0, len(l), 3)] if len(m) == 4])
输出:
[[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]
使用生成器:
for n in (m for m in (l[i:i+4] for i in range(0, len(l), 3)) if len(m) == 4):
print(n)
输出:
[1, 2, 3, 4]
[4, 5, 6, 7]
[7, 8, 9, 10]