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 中阅读有关zip
和itertools.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乘以相等长度的元组的主要内容,如果未能解决你的问题,请参考以下文章