2

无论我尝试什么,我似乎都无法用我的大脑来实现这一点,但必须有一种方法可以使用生成器函数进行映射。

例如,如果我想将列表 [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]

如果您不知道 [1,2,3,4,5,6,7,8,9,10] 列表的长度,您将如何做到这一点?

4

2 回答 2

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]

它利用了在用完时zip停止绘制术语的事实。a

于 2012-07-15T22:40:37.850 回答
1

如果您具有随机访问权限,则遍历第一个列表并通过第一个索引以其他列表长度为模来访问其他元素。

如果您只能迭代,则迭代第一个并在第二个迭代器中使用一个迭代器,每次它到达第二个列表结束时都会重新启动。

如果确实必须使用生成器完成,则需要两个:外部生成第一个列表元素与第二个生成器的值的乘积,第二个生成器生成第二个列表值并在它们的末尾重新开始。

于 2012-07-15T21:14:19.497 回答