是否有任何内置函数允许对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)
答案 0 :(得分:9)
没有内置方式,但有一种非常简单的方法:
[f(aItem, bItem) for aItem, bItem in zip(a, b)]
。 。 。其中f
是要以元素方式应用的函数。对于你的情况:
[100*abs(aItem - bItem)/aItem < 3 for aItem, bItem in zip(a, b)]
如果你发现自己做了很多,特别是对于长元组,你可能需要查看Numpy
,它提供了一个功能齐全的向量运算系统,其中有许多常见的向量函数(基本操作,trig函数等)应用元素。
答案 1 :(得分:6)
地图功能
>>> 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]
修改强>
当然不是地图,你可以使用列表推导,比如BrenBarn做http://docs.python.org/tutorial/datastructures.html#nested-list-comprehensions
已删除EDIT 2 拉链,感谢DSM指出不需要拉链
答案 2 :(得分:4)
为什么不使用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)
答案 3 :(得分:1)
我不知道这样的操作,也许Python的一些函数编程功能可以工作(map?reduce?),虽然把list comprehension放在一起(如果不需要列表,则生成器)相对简单:
[100*abs(j-b[i])/j < 3 for i,j in enumerate(a)]
[False, False, True]
感谢@delnan为原始的,更明确/更详细的版本指出了一个非常好的简化:
[True if 100*abs(j-b[i])/j < 3 else False for i,j in enumerate(a)]
答案 4 :(得分:0)
我会说Pythonic方式是列表理解:
a = (1, 2, 4)
和b = (1.1, 2.1, 4.1)
然后,在一行中:
TEST = [100*abs(a[i]-b[i])/a[i] > th for i in range(len(A))]
答案 5 :(得分:0)
def pctError(observed, expected):
return (observed-expected)/expected * 100.0
a = (1, 2, 4)
b = (1.1, 2.1, 4.1)
th = 3
pctErrors = map(lambda t:pctError(*t), zip(a,b))
# returns [-9.091, -4.76, -2.44]
map(lambda x: x < th, pctErrors)
[x < th for x in pctErrors]
# both return [True, True, True]
# or if you always need absolute % errors
map(lambda x: abs(x) < th, pctErrors)
[abs(x) < th for x in pctErrors]
# both return [False, False, True]