python 循环遍历列表中的 n 个连续项

3 投票
6 回答
2142 浏览
提问于 2025-04-17 18:59

我需要在一个列表中逐个处理n个连续的元素。

比如说:

data = [1,2,3,4,5,6,7]

我需要处理:

1 2
2 3
3 4
4 5

或者:

1 2 3
2 3 4
3 4 5
4 5 6

有没有什么zip函数可以做到这一点呢?

6 个回答

3

具体的答案:

>>> zip(data,data[1:])
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]

一般的答案:

>>> def consecutives(data,per_set):
...   return zip(*[data[n:] for n in range(per_set)])
...
>>> consecutives(range(1,8),2)
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]
>>> consecutives(range(1,8),3)
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]
>>> consecutives(range(1,8),4)
[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6), (4, 5, 6, 7)]
3

假设你总是对一个列表或其他序列进行操作,并且不需要处理任意的可迭代对象:

def group(seq, n):
    return (seq[i:i+n] for i in range(len(seq)-n+1))

示例:

>>> list(group([1,2,3,4,5,6,7], 2))
[[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]
>>> list(group([1,2,3,4,5,6,7], 3))
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]

如果你需要对任何任意的可迭代对象(可能不支持 len() 或切片操作)进行处理,你可以参考 pairwise 这个方法

from itertools import tee, izip

def group(iterable, n):
    "group(s, 3) -> (s0, s1, s2), (s1, s2, s3), (s2, s3, s4), ..."
    itrs = tee(iterable, n)
    for i in range(1, n):
        for itr in itrs[i:]:
            next(itr, None)
    return izip(*itrs)

>>> list(group(iter([1,2,3,4,5,6,7]), 2))
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]
>>> list(group(iter([1,2,3,4,5,6,7]), 3))
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]
6

我不太确定你具体想要什么,但你可以试试这个:

data = [1, 2, 3, 4, 5, 6, 7]

n = 3

[data[i:i+n] for i in range(len(data) - n + 1)]

# [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]

或者:

f = lambda data, n: [data[i:i+n] for i in range(len(data) - n + 1)]

for x, y, z in f([1, 2, 3, 4, 5, 6, 7], 3):
    print x, y, z

撰写回答