Python 等长元组相乘
Python Multiply tuples of equal length
我希望有一种优雅或有效的方法来乘以整数(或浮点数)序列。
我的第一个想法是尝试 (1, 2, 3) * (1, 2, 2)
结果 (1, 4, 6)
,即各个乘法的乘积。
尽管 python 并未预设为序列执行此操作。很好,我真的不希望这样。那么,将两个系列中的每个项目与其各自的索引相乘(或可能还有其他算术运算)的 ic 方法是什么?
第二个例子(0.6, 3.5) * (4, 4)
= (2.4, 14)
有了列表理解,操作可以像
一样完成
def seqMul(left, right):
return tuple([value*right[idx] for idx, value in enumerate(left)])
seqMul((0.6, 3.5), (4, 4))
最简单的方法是使用zip
function, with a 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)
在Python2.x,zip
returns a list of tuples. If you want to avoid creating the temporary list, you can use 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
之间的区别的信息。
A = (1, 2, 3)
B = (4, 5, 6)
AB = [a * b for a, b in zip(A, B)]
对于较大的输入,使用 itertools.izip 而不是 zip。
如果您对逐元素乘法感兴趣,您可能会发现许多其他逐元素数学运算也很有用。如果是这种情况,请考虑使用 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])
更简单的方法是:
from operator import mul
In [19]: tuple(map(mul, [0, 1, 2, 3], [10, 20, 30, 40]))
Out[19]: (0, 20, 60, 120)
我希望有一种优雅或有效的方法来乘以整数(或浮点数)序列。
我的第一个想法是尝试 (1, 2, 3) * (1, 2, 2)
结果 (1, 4, 6)
,即各个乘法的乘积。
尽管 python 并未预设为序列执行此操作。很好,我真的不希望这样。那么,将两个系列中的每个项目与其各自的索引相乘(或可能还有其他算术运算)的 ic 方法是什么?
第二个例子(0.6, 3.5) * (4, 4)
= (2.4, 14)
有了列表理解,操作可以像
一样完成def seqMul(left, right):
return tuple([value*right[idx] for idx, value in enumerate(left)])
seqMul((0.6, 3.5), (4, 4))
最简单的方法是使用zip
function, with a 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)
在Python2.x,zip
returns a list of tuples. If you want to avoid creating the temporary list, you can use 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
之间的区别的信息。
A = (1, 2, 3)
B = (4, 5, 6)
AB = [a * b for a, b in zip(A, B)]
对于较大的输入,使用 itertools.izip 而不是 zip。
如果您对逐元素乘法感兴趣,您可能会发现许多其他逐元素数学运算也很有用。如果是这种情况,请考虑使用 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])
更简单的方法是:
from operator import mul
In [19]: tuple(map(mul, [0, 1, 2, 3], [10, 20, 30, 40]))
Out[19]: (0, 20, 60, 120)