通过逐步进展的列表进行Python迭代

时间:2017-04-14 12:18:40

标签: python list itertools

鉴于以下清单:

letters = ('a', 'b', 'c', 'd', 'e', 'f', 'g')
numbers = ('1', '2', '3', '4')

如何生成产生以下内容的迭代列表:

output = [('a', '1'), ('b', '2'), ('c', '3'), ('d', '4'), 
          ('e', '1'), ('f', '2'), ('g', '3'), ('a', '4'),
          ('b', '1'), ('c', '2'), ('d', '3'), ('e', '4'),
          ('f', '1'), ('g', '2')...]

我觉得我应该能够使用

生成所需的输出
output = (list(zip(letters, itertools.cycle(numbers))

但这会产生以下结果:

output = [('a', '1'), ('b', '2'), ('c', '3'), ('d', '4'),
          ('e', '1'), ('f', '2'), ('g', '3')]

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果您正在寻找无限生成器,则可以cycle使用zipzip(itertools.cycle(x), itertools.cycle(y))两个列表,形式为>>> for x in zip(itertools.cycle(letters), itertools.cycle(numbers)): ... print(x) ... ('a', '1') ('b', '2') ('c', '3') ('d', '4') ('e', '1') ('f', '2') ('g', '3') ('a', '4') ('b', '1') ('c', '2') ('d', '3') ... 。这将为您提供所需的发电机:

<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>

答案 1 :(得分:0)

如果你想要一个有限的元素列表,这应该可行

import itertools

letters = ('a', 'b', 'c', 'd', 'e', 'f', 'g')
numbers = ('1', '2', '3', '4')
max_elems = 10

list(itertools.islice((zip(itertools.cycle(letters), itertools.cycle(numbers))), max_elems))

结果

[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4'), ('e', '1'), ('f', '2'), ('g', '3'), ('a', '4'), ('b', '1'), ('c', '2')]