python - 生成器中的循环列表

标签 python python-3.x

提议 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/

相关文章:

python - 生成任意数量的 if 语句和字典索引

python - Emacs Python 模式中类似 bpython 的自动完成和参数描述?

python - Tkinter 框架展开仅显示我的一半窗口

python - 使用 `contains` 合并 DataFrame(不是完全匹配!)

python - 如何通过字符串将 pandas 数据框分割成 block ?

python - 从 pandas 流中提取值

python - 通过 tweepy 从 django 表单将图像上传到 Twitter

python - 如何让 Tornado websocket 客户端接收服务器通知?

python - “zsh: illegal hardware instruction python” 在 macbook pro M1 上使用 Tensorflow

Python Itertools Combinatinos 检索空列表