比较两个元组的所有元素(具有all()功能)
所以我知道元组的比较按字典顺序工作:
元组和列表按照字典顺序使用相应元素的比较进行比较。 这意味着为了比较相等,每个元素必须相等并且两个序列必须是相同类型并且具有相同长度。
如果不相等,序列的顺序与它们的第一个不同元素相同。 例如,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坐标是大于0,但y坐标较小,它仍然会返回true,这不是在这种情况下需要的。
作为一个小问题/讨论:
我不确定为什么比较两个不同值的元组是以这种方式返回的。 你没有得到任何类型的索引,所以你比较一个元组(不测试相等性)得到的唯一东西是,在元组中的某个点,其中一个比较会在它们是不等于。 你怎么能利用这一点?
你可以通过列表理解和内置的zip来实现:
>>> a = (100, 0)
>>> b = (50, 50)
>>> [(a > b) for a, b in zip(a,b)]
[True, False]
您可以在返回的列表中使用all()或any()。
用第二个代码示例中的tuple(i > j for i, j in zip(a,b))
替换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
你可能会考虑使用下面的矢量化方法 ,它通常性能更高,语法/语义上非常清晰:
>>> 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擅长) 。 尝试一下。 :)
上一篇: Comparing all elements of two tuples (with all() functionality)
下一篇: Possible to return two lists from a list comprehension?