首页 文章

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

提问于
浏览
4

所以我知道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

    你可以通过列表理解和内置的zip来实现这一点:

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

    您可以在返回的列表中使用all()或any() .

  • 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
    
  • 1

    您可以考虑使用以下 vectorized approach ,它通常性能更高,语法/语义非常清晰:

    >>> 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()查询方法 . 如果您将执行类似向量的操作(如 screen coordinates 示例所示),您可以考虑使用'a'和'b'作为numpy数组,而不是元组 . 这样可以最有效地实现您所寻求的内容:无需预转换,基于Python的循环将被高效的基于numpy的循环所取代 . 这值得强调,因为涉及两个并且可能涉及三个循环:(1)转换期间的预处理循环(可以消除); (2)逐项比较循环; (3)一个回答任何/所有问题的查询循环 .

    • 请注意,我可以've also created a numpy array from ' b',但不这样做会消除一个转换步骤和 pre-processing time . 由于该方法导致一个操作数为 numpy array 而另一个操作数为 tuple ,随着序列的增长,这可能/可能不会导致较快的逐项比较(严格的numpy-to-numpy擅长) . 试试吧 . :)

  • 1

    我觉得答案中缺少 Map 和lambda函数的使用

    >>> a = (100, 0)
    >>> b = (50, 50)
    >>> all(map(lambda x,y: x > y, a, b)
    False
    
  • 9

    要获得描述的行为,请尝试:

    [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!"
    

    我希望这有帮助 .

相关问题