Python乘以相等长度的元组

Posted

技术标签:

【中文标题】Python乘以相等长度的元组【英文标题】:Python Multiply tuples of equal length 【发布时间】: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 的答案,但这可能根本不是一个好的理由。 【参考方案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,否则完全一样。

以上是关于Python乘以相等长度的元组的主要内容,如果未能解决你的问题,请参考以下文章

python

python3元组

好好学python · 元组

好好学python · 元组

pythonPython中的元组字典——05

使用 AliasableEvalFunc 并在 Java UDF 中读取一组元组