提议 s = [1, 2, 3, 4]
如果你 zip(s, s[1:])
返回 [(1, 2), (2, 3), (3, 4)]
.
是否可以重写 zip(s, s[1:])
以返回 [(1, 2), (2, 3), (3, 4), (4, 1 )]
?
或者为了一般性,是否可以将列表与自身压缩在一起,使最后一个元组成为 (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)]
关于python - 生成器中的循环列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47603310/