迭代两个不同长度的发电机,一个缠绕

Val*_*dar 2 python dictionary list generator

无论我尝试什么,我似乎无法通过我的大脑实现这一点,但必须有一种方法来映射生成器功能.

例如,如果我想将列表[1,2,3,4,5,6,7,8,9,10]中的每个成员与列表[1,2,3]中的相应成员相乘,那么之后[1,2,3]列表用完它会重启:

   [1  2  3  4  5  6  7  8  9  10]

x  [1  2  3  1  2  3  1  2  3  1 ]
------------------------------------
   [1  4  9  4  10 18 7  16 27 10]
Run Code Online (Sandbox Code Playgroud)

如果您不知道[1,2,3,4,5,6,7,8,9,10]列表的长度,您会怎么做?

DSM*_*DSM 14

itertools模块里是你的朋友.一种方法是使用itertools.cycle循环遍历第二个列表:

>>> import itertools
>>> a = range(1, 11)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> b = itertools.cycle([1,2,3])
>>> b
<itertools.cycle object at 0x1004be830>
>>> ans = [i*j for i,j in zip(a,b)]
>>> ans
[1, 4, 9, 4, 10, 18, 7, 16, 27, 10]
Run Code Online (Sandbox Code Playgroud)

这利用了zipa用完时停止绘制术语的事实.

  • 列表解析的另一种选择是`itertools.imap()`和`operator.mul()`:`imap(mul,a,cycle([1,2,3]))`. (3认同)