所以我知道comparisons on tuples以字典方式工作:
使用相应元素的比较,按字典顺序比较元组和列表。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须是相同的类型并具有相同的长度。
如果不相等,则序列的排序与其第一个不同的元素相同。例如,cmp([1,2,x],[1,2,y])返回与cmp(x,y)相同的值。如果相应的元素不存在,则首先排序较短的序列(例如,[1,2]< [1,2,3])。
所以从这个:
>>> a = (100, 0)
>>> b = (50, 50)
>>> a > b
True
但是我想按顺序比较2个元组的所有元素,所以在功能上我想要类似的东西(使用上面的值):
>>> a > b
(True, False) #returned tuple containing each comparison
>>> all(a > b)
False
作为实践中的一个例子,对于像屏幕坐标这样的东西,如果你想检查某些东西是否在(0,0)的屏幕“内部”,但是做了比较,如coord> (0,0),如果x coord大于0,但是y coord更小,它仍然会返回true,这不是这种情况下所需要的。
作为一个子问题/讨论:
我不确定为什么以这种方式返回比较2个不同值的元组。你没有得到任何类型的索引,所以你从比较一个元组(不是测试相等)得到的唯一一点就是在元组的某个点上,其中一个比较会在它们出现时抛出一个真或假的值。不平等。你怎么能利用这个呢?
答案 0 :(得分:9)
你可以通过列表理解和内置的zip来实现这个目标:
>>> a = (100, 0)
>>> b = (50, 50)
>>> [(a > b) for a, b in zip(a,b)]
[True, False]
您可以在返回的列表中使用all()或any()。
答案 1 :(得分:1)
在第二个代码示例中将a > b
替换为tuple(i > j for i, j in zip(a,b))
。
>>> a = (100, 0)
>>> b = (50, 50)
>>> tuple(i > j for i, j in zip(a,b))
(True, False)
>>> all(i > j for i, j in zip(a,b))
False
答案 2 :(得分:1)
您可以考虑使用以下矢量化方法,这通常性能更高,语法/语义非常清晰:
>>> import numpy
>>>
>>> a = (100, 0)
>>> b = (50, 50)
>>> numpy.array(a) > b
array([ True, False], dtype=bool)
>>>
>>> (numpy.array(a) > b).any()
True
>>> (numpy.array(a) > b).all()
False
numpy非常高效,上面生成的对象也嵌入了你想要的any()/ all()查询方法。如果您要执行类似矢量的操作(如屏幕坐标示例所示),您可以考虑使用' a'和' b'作为numpy数组,而不是元组。这样可以最有效地实现您所寻求的内容:无需预转换,基于Python的循环将被高效的基于numpy的循环所取代。这值得强调,因为涉及两个并且可能涉及三个循环:(1)转换期间的预处理循环(可以消除); (2)逐项比较循环; (3)一个回答任何/所有问题的查询循环。
请注意,我还可以在' b'中创建一个numpy数组,但是这样做不会消除一个转换步骤和预处理时间。由于该方法导致一个操作数为 numpy数组而另一个操作数为元组,因此随着序列的增长,这可能/可能不会导致更快的逐个项目项目比较(严格的numpy-to-numpy擅长)。试试吧。 :)
答案 3 :(得分:1)
我觉得答案中没有使用map和lambda函数
>>> a = (100, 0)
>>> b = (50, 50)
>>> all(map(lambda x,y: x > y, a, b)
False
答案 4 :(得分:0)
要获得描述的行为,请尝试:
[ai > bi for ai,bi in zip(a,b)]
以这种方式返回元组比较的原因是你可能想写下这样的东西:
if a >= (0.,0.):
print "a has only positive values"
else:
print "a has at least one negative value"
如果Python要返回你描述的元组,那么别的东西永远不会发生。试试
if (False,False):
print "True!" # This is what is printed.
else:
print "False!"
我希望这会有所帮助。