优雅的方式来执行元组算术

51 python tuples numpy python-2.7

什么是最优雅和简洁的方法(没有创建我自己的类与运算符重载)来执行Python 2.7中的元组算法?

可以说我有两个元组:

a = (10, 10)
b = (4, 4)
Run Code Online (Sandbox Code Playgroud)

我的预期结果是

c = a - b = (6, 6)
Run Code Online (Sandbox Code Playgroud)

我目前使用:

c = (a[0] - b[0], a[1] - b[1])
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

c = tuple([(i - j) for i in a for j in b])
Run Code Online (Sandbox Code Playgroud)

但结果是(6, 6, 6, 6).我相信上面的工作作为嵌套for循环导致4次迭代和结果中的4个值.

vro*_*del 64

如果你正在寻找快速,你可以使用numpy:

>>> import numpy
>>> numpy.subtract((10, 10), (4, 4))
array([6, 6])
Run Code Online (Sandbox Code Playgroud)

如果你想把它保存在一个元组中:

>>> tuple(numpy.subtract((10, 10), (4, 4)))
(6, 6)
Run Code Online (Sandbox Code Playgroud)


Jar*_*red 34

一种选择是,

>>> from operator import sub
>>> c = tuple(map(sub, a, b))
>>> c
(6, 6)
Run Code Online (Sandbox Code Playgroud)

itertools.imap可以作为替代品map.

当然,你也可以使用其他功能,从operatoradd,mul,div,等.

但我会认真考虑进入另一个数据结构,因为我不认为这种类型的问题适合tuples


Ash*_*ary 30

使用zip和生成器表达式:

c = tuple(x-y for x, y in zip(a, b))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> a = (10, 10)
>>> b = (4, 4)
>>> c = tuple(x-y for x, y in zip(a, b))
>>> c
(6, 6)
Run Code Online (Sandbox Code Playgroud)

使用itertools.izip的内存有效的解决方案.

帮助zip:

>>> print zip.__doc__
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

Return a list of tuples, where each tuple contains the i-th element
from each of the argument sequences.  The returned list is truncated
in length to the length of the shortest argument sequence.
Run Code Online (Sandbox Code Playgroud)

  • 关于`izip`的注释:在Python 3中,常规的`zip`函数就像Python 2的`izip`一样,所以你可以在这个答案节目中使用`zip`作为例子. (2认同)

小智 9

JFYI,100000 次迭代在我的笔记本电脑中的执行时间

np.subtract(a, b) : 0.18578505516052246

tuple(x - y for x, y in zip(a, b)) : 0.09348797798156738

tuple(map(lambda x, y: x - y, a, b)) : 0.07900381088256836

from operator import sub tuple(map(sub, a, b)) : 0.044342041015625

运算符对我来说看起来更优雅。


mii*_*otu 5

即使lambda通常是不可取的,这也可以完全不用导入就很好地完成:

tuple(map(lambda x, y: x - y, a, b))
Run Code Online (Sandbox Code Playgroud)

如果要获取二维坐标平面上两个点之间的距离,则应使用线对减法的绝对值。

tuple(map(lambda x ,y: abs(x - y), a, b))
Run Code Online (Sandbox Code Playgroud)