2012-04-28 104 views
3

所以我知道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)的屏幕,但做过类似坐标的比较>(0,0),如果x坐标大于0,但y坐标较小,它仍然会返回true,这不是这种情况下需要的。

作为一种子问题/讨论:
我不知道为什么比较两个不同值的元组以这种方式返回。您还没有给出任何形式的指数,让你从比较的元组(未测试平等)得到的唯一的事情是,在元组的一些点,攀比的人会抛出一个true或false值时,他们不等于。你怎么能利用这一点?

+0

的元组比较有用的情况是版本号; '(3,1,4,2)<(3,2,0,1)'之类的东西 – 2012-04-28 00:33:39

回答

7

你可以用一个列表理解和内置的ZIP实现这一点:

>>> a = (100, 0) 
>>> b = (50, 50) 
>>> [(a > b) for a, b in zip(a,b)] 
[True, False] 

您可以在返回的列表上使用的所有()或()。

+2

如果你打电话'all'或'any'那么你不再需要列表理解,但可以脱身生成器,由于特殊的语法规则,您可以删除多余的括号。 – 2012-04-28 00:39:04

1

你的第二个代码示例中替换a > btuple(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 
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!" 

我希望这会有所帮助。

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的到numpy的擅长)。尝试一下。 :)

0

我感觉就像使用地图和lambda函数从答案失踪

>>> a = (100, 0) 
>>> b = (50, 50) 
>>> all(map(lambda x,y: x > y, a, b) 
False 
相关问题