Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个元组的所有元素(使用all()功能)_Python_Comparison_Tuples_Language Design - Fatal编程技术网

Python 比较两个元组的所有元素(使用all()功能)

Python 比较两个元组的所有元素(使用all()功能),python,comparison,tuples,language-design,Python,Comparison,Tuples,Language Design,所以我知道这是一个词典: 元组和列表使用对应元素的比较按字典顺序进行比较。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须具有相同的类型和长度 如果不相等,则序列的顺序与其第一个不同的元素相同。例如,cmp([1,2,x],[1,2,y])返回与cmp(x,y)相同的结果。如果对应的元素不存在,则先排序较短的序列(例如,[1,2](0,0)之类的比较,如果x坐标大于0,但y坐标较小,它仍会返回true,这在本例中并不需要 作为子问题/讨论: 我不知道为什么比较两个不同值的元组会以这种方

所以我知道这是一个词典:

元组和列表使用对应元素的比较按字典顺序进行比较。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须具有相同的类型和长度

如果不相等,则序列的顺序与其第一个不同的元素相同。例如,cmp([1,2,x],[1,2,y])返回与cmp(x,y)相同的结果。如果对应的元素不存在,则先排序较短的序列(例如,[1,2]<[1,2,3])

因此:

>>> a = (100, 0)
>>> b = (50, 50)
>>> a > b
True
但是我想按顺序比较两个元组的所有元素,所以在功能上我想要类似的东西(使用上面的值):

作为实践中的一个例子,对于屏幕坐标之类的东西,如果您想检查屏幕(0,0)处是否有东西“在”屏幕内,但进行了坐标>(0,0)之类的比较,如果x坐标大于0,但y坐标较小,它仍会返回true,这在本例中并不需要

作为子问题/讨论:

我不知道为什么比较两个不同值的元组会以这种方式返回。您没有得到任何类型的索引,因此您从比较元组(不是测试相等)中得到的唯一结果是,在元组中的某个点,当它们不相等时,其中一个比较将抛出一个true或false值。您如何利用这一点?

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

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

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

在第二个代码示例中将
a>b
替换为
元组(i>j表示zip(a,b)中的i,j))

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

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

[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返回您描述的元组,那么else将永远不会发生。试一试

if (False,False):
    print "True!" # This is what is printed.
else:
    print "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()查询方法。如果您将执行像vector的操作(正如您的<强>屏幕坐标< /强>示例所建议的),您可以考虑将“A”和“B”作为NUMPY数组,而不是元组。这将实现您所寻求的最高效的实现:无需预转换,基于Python的循环将被高效的基于numpy的循环所取代。这一点值得强调,因为涉及到两个甚至三个循环:(1)转换期间的预处理循环(可以消除);(2) 逐项比较循环;(3)回答任意/所有问题的查询循环

  • 请注意,我也可以从“b”创建一个numpy数组,但不这样做就消除了一个转换步骤和预处理时间。由于这种方法导致一个操作数是numpy数组,另一个是元组,随着序列的增长,这可能/可能不会导致逐项比较的速度变慢(严格的numpy到numpy比较好)。试试看。:)


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

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

元组比较的一个有用情况是版本号
(3,1,4,2)<(3,2,0,1)
以及类似的东西如果调用
all
any
,则您不再需要列表理解,而是可以使用生成器,由于特殊的语法规则,它允许您删除额外的一对括号。
>>> a = (100, 0)
>>> b = (50, 50)
>>> all(map(lambda x,y: x > y, a, b))
False