【问题标题】:Python Multiply tuples of equal lengthPython乘以相等长度的元组
【发布时间】:2015-02-17 02:50:06
【问题描述】:

我希望有一种优雅或有效的方法来乘以整数(或浮点数)序列。

我的第一个想法是尝试(1, 2, 3) * (1, 2, 2) 会得到(1, 4, 6),这是单个乘法的乘积。

虽然 python 没有预设为序列执行此操作。这很好,我真的没想到会这样。那么将两个系列中的每个项目与它们各自的索引相乘(或可能还有其他算术运算)的pythonic方法是什么?

第二个例子(0.6, 3.5) * (4, 4) = (2.4, 14)

【问题讨论】:

  • 也许您应该研究一下numpy,当与两个numpy.arrays 一起使用时,乘法运算符的行为会像您预期的那样。
  • @Akavall,您愿意发布一个 numpy 示例吗?
  • @ThorSummoner:看我的回答。
  • @ThorSummoner 你有没有想过接受答案?
  • @VictorCastilloTorres 这很难,如果三个相互竞争的答案是最pythonic/优雅的,我没有资格说哪个;希望投票能让我明白这一点。由于它有可能在没有导入的情况下工作,我目前倾向于第二个 thefourtheye 的答案,但这可能根本不是一个好的理由。

标签: python math tuples sequence


【解决方案1】:

最简单的方法是使用zip函数,加上generator expression,像这样

tuple(l * r for l, r in zip(left, right))

例如,

>>> tuple(l * r for l, r in zip((1, 2, 3), (1, 2, 3)))
(1, 4, 9)
>>> tuple(l * r for l, r in zip((0.6, 3.5), (4, 4)))
(2.4, 14.0)

在 Python 2.x 中,zip 返回一个元组列表。如果你想避免创建临时列表,可以使用itertools.izip,像这样

>>> from itertools import izip
>>> tuple(l * r for l, r in izip((1, 2, 3), (1, 2, 3)))
(1, 4, 9)
>>> tuple(l * r for l, r in izip((0.6, 3.5), (4, 4)))
(2.4, 14.0)

您可以在this question 中阅读有关zipitertools.izip 之间区别的更多信息。

【讨论】:

    【解决方案2】:

    更简单的方法是:

    from operator import mul
    
    In [19]: tuple(map(mul, [0, 1, 2, 3], [10, 20, 30, 40]))
    Out[19]: (0, 20, 60, 120)
    

    【讨论】:

    • 很好,可以轻松扩展以处理其他二元运算符。虽然我认为 OP 可能想要tuple(map(mul, seq1, seq2)).
    • @martineau 更新答案,谢谢!
    • 你的输入和输出不匹配。具体来说,您应该以tuple 结束,而不是list ;-)
    【解决方案3】:

    如果您对逐元素乘法感兴趣,您可能会发现许多其他逐元素数学运算也很有用。如果是这种情况,请考虑使用numpy 库。

    例如:

    >>> import numpy as np
    >>> x = np.array([1, 2, 3])
    >>> y = np.array([1, 2, 2])
    >>> x * y
    array([1, 4, 6])
    >>> x + y
    array([2, 4, 5])
    

    【讨论】:

      【解决方案4】:

      使用列表推导可以像这样完成操作

      def seqMul(left, right):
          return tuple([value*right[idx] for idx, value in enumerate(left)])
      
      seqMul((0.6, 3.5), (4, 4))
      

      【讨论】:

        【解决方案5】:
        A = (1, 2, 3)
        B = (4, 5, 6)    
        AB = [a * b for a, b in zip(A, B)]
        

        对于较大的输入,使用 itertools.izip 而不是 zip。

        【讨论】:

        • 你能发布一个 itertools 的例子吗? @thefourtheye 已经发布了这个确切的 zip + 列表理解类型的答案
        • @ThorSummoner,是的,它与我写答案时发布的另一个答案相同。对于 izip 版本import itertools 并使用itertools.izip 而不是zip,否则完全一样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 2011-05-11
        • 2016-09-04
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        相关资源
        最近更新 更多