比较两个元组的所有元素(具有all()功能)

时间:2012-04-28 00:21:06

标签: python comparison tuples language-design

所以我知道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个不同值的元组。你没有得到任何类型的索引,所以你从比较一个元组(不是测试相等)得到的唯一一点就是在元组的某个点上,其中一个比较会在它们出现时抛出一个真或假的值。不平等。你怎么能利用这个呢?

5 个答案:

答案 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!"

我希望这会有所帮助。