是否有任何内置函数允许对Python 3中的元组进行元素操作?如果没有,执行这些操作的"pythonic"方式是什么?
例如:我想借此之间的百分比差异a,并b与他们比较了一些门槛th.
>>> a = (1, 2, 4)
>>> b = (1.1, 2.1, 4.1)
>>> # compute pd = 100*abs(a-b)/a = (10.0, 5.0, 2.5)
>>> th = 3
>>> # test threshold: pd < th => (False, False, True)
Run Code Online (Sandbox Code Playgroud)
没有内置方式,但有一种非常简单的方法:
[f(aItem, bItem) for aItem, bItem in zip(a, b)]
Run Code Online (Sandbox Code Playgroud)
...这里f是要应用的elementwise功能.对于你的情况:
[100*abs(aItem - bItem)/aItem < 3 for aItem, bItem in zip(a, b)]
Run Code Online (Sandbox Code Playgroud)
如果你发现自己做了很多,特别是对于长元组,你可能想看一下Numpy,它提供了一个功能齐全的向量操作系统,其中许多常见的向量函数(基本操作,触发函数等)都是元素应用的.
地图功能
>>> a = (1, 2, 4)
>>> b = (1.1, 2.1, 4.1)
>>> map(lambda a,b: 100*abs(a-b)/a < 3, a, b)
[False, False, True]
Run Code Online (Sandbox Code Playgroud)
编辑
当然不是地图,你可以使用列表推导,比如BrenBarn做 http://docs.python.org/tutorial/datastructures.html#nested-list-comprehensions
删除了EDIT 2 zip,感谢DSM指出不需要拉链
为什么不使用NumPy?
import numpy as np
a = np.array([1,2,4])
b = np.array([1.1, 2.1, 4.1])
pd = 100*abs(a-b)/a # result: array([ 10. , 5. , 2.5])
th = 3
pd < th # result: array([False, False, True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)