【问题标题】:Iterating on Two generators with different length, with one wrapped around迭代两个不同长度的生成器,一个环绕
【发布时间】:2012-07-15 20:48:31
【问题描述】:

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

例如,如果我想将列表 [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] 列表的长度,您会怎么做?

【问题讨论】:

    标签: python list dictionary generator


    【解决方案1】:

    itertools module 是您的朋友。一种方法是使用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]
    

    它利用了zipa 用完时停止绘制术语这一事实。

    【讨论】:

    • @ValentineBondar:如果这解决了您的问题,请点击左侧的复选标记接受此答案。
    • 列表理解的替代方案是 itertools.imap()operator.mul(): imap(mul, a, cycle([1, 2, 3]))
    【解决方案2】:

    如果你有随机访问而不是遍历第一个列表并通过第一个索引以其他列表长度为模来访问其他元素。

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

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

    【讨论】:

    • 你能给我简单的例子吗?我还是 python 的新手,不能很容易地想象它......
    • 抱歉,您没有使用 python 标签标记您的问题。所以我认为这是一个更一般的编程问题。我的 Python 经验是很久以前的事了。考虑使用 python 标签重新标记您的问题,我相信其他人会提供帮助。
    猜你喜欢
    • 2017-10-15
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多