发电机中的圆形列表



提出s = [1, 2, 3, 4]

如果您返回[(1, 2), (2, 3), (3, 4)]zip(s, s[1:])。是否可以重写zip(s, s[1:])返回[(1, 2), (2, 3), (3, 4), (4, 1)]

或出于一般性的缘故,可以将自己的列表拉开,以使最后一个toupe成为(list[-1], list[0])

是的,您可以使用itertools进行方便的迭代器来优雅地完成此操作:

>>> from itertools import cycle, islice
>>> s = [1, 2, 3, 4]
>>> list(zip(s, islice(cycle(s), 1, None)))
[(1, 2), (2, 3), (3, 4), (4, 1)]

注意,itertools.cycle的工作原理:

cycle('ABCD') --> A B C D A B C D ...

它是无限的迭代器,所以要小心。zip这里最短停止,因此工作正常。

另外,itertools.islice

islice('ABCDEFG', 2, None) --> C D E F G

就像 slice或序列切片一样工作,即 my_list[1:] == my_list[1:None] == my_list[slice(1, None)],除了它在上起作用,而不仅仅是序列。

无论如何,请注意此方法是可以推广的:

>>> list(zip(s, islice(cycle(s), 2, None)))
[(1, 3), (2, 4), (3, 1), (4, 2)]
>>> list(zip(s, islice(cycle(s), 3, None)))
[(1, 4), (2, 1), (3, 2), (4, 3)]
>>> list(zip(s, islice(cycle(s), 4, None)))
[(1, 1), (2, 2), (3, 3), (4, 4)]
import itertools as it

iterable = [1, 2, 3, 4]
c = it.cycle(iterable)
next(c)
list(zip(iterable, c))
# [(1, 2), (2, 3), (3, 4), (4, 1)]
>>> s = [1, 2, 3, 4]
>>> zip(s, s[1:] + s[:1])
[(1, 2), (2, 3), (3, 4), (4, 1)]

可以用参数化的切片索引做出纯python循环zip答案,添加切片

s = [1, 2, 3, 4]
n = 2
list(zip(s[n::] + s[0:n], s[n+1::] + s[0:n+1]))
Out[100]: [(3, 4), (4, 1), (1, 2), (2, 3)]
n = 0
list(zip(s[n::] + s[0:n], s[n+1::] + s[0:n+1]))
Out[101]: [(1, 2), (2, 3), (3, 4), (4, 1)]

最新更新