Python生成带偏移和条件的子列表

1 投票
3 回答
1688 浏览
提问于 2025-04-18 10:30

嘿,我想从一个列表中生成子列表。比如我有这样一个列表:
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

有没有人有好的主意?!我在考虑用生成器,但不太确定。

3 个回答

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]
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])
[l[i:i+4] for i in range(0, len(l)-3, 3)]

这段代码会生成一个叫做 a 的变量,它的值是一个包含三个小列表的大列表,具体内容是 [[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]

另外,你也可以用一种叫做列表推导式的方法来实现这个。

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]]

撰写回答