混淆Python min测验

时间:2015-10-10 01:42:25

标签: python

刚才我在this page看到了一个测验:

x, y = {0}, {1}

示例答案是

min({0},{1})={0}

从文件中我知道:

  

min(iterable [,key = func]) - >值
  min(a,b,c,... [,key = func]) - >值

     

使用单个可迭代参数,返回其最小项   使用两个或多个参数,返回最小的参数。

但为什么min({1},{0})={1}min({0,2},1) # 1 min(1,{0,2}) # 1 min({1},[2,3]) # [2,3] min([2,3],1) # 1

我还尝试过其他几个:

{{1}}

3 个答案:

答案 0 :(得分:9)

比较运算符<<=>=>分别检查一个集合是否是另一个集合的严格子集,子集,超集或严格超集

对于所有这些,

{0}{1}都是False,因此结果取决于检查顺序和运算符。

答案 1 :(得分:8)

这里的关键点是,这两个集合不是彼此的子集,因此False的{​​{1}}都是<,即使它们不相等:

>>> {0} < {1}
False
>>> {0} > {1}
False
>>> {0} == {1}
False

哪一个更小?集合不提供strict weak ordering的事实意味着没有正确答案。

答案 2 :(得分:7)

min的实现大致如下:

def min(*args):
    least = args[0]
    for arg in args:
        if arg < least:
            least = arg
    return least

比较运算符对集合的工作方式打破了这隐含的假设之一:对于每对对象,它们是相等的,或a < bb < a{0}{1}都不会相互比较,因此min会给您不一致的答案。

您看到的其他结果是因为Python定义混合类型的顺序的规则。 setint不具有可比性 - 这两种类型都没有定义用于与另一种进行比较的规则。这导致Python 2应用一个名为&#34;任意但一致的顺序的规则&#34; - 选择其中一种类型为&#34; lower&#34;类型,它将保持程序生命周期的较低类型。在实践中,它在您运行的所有代码中都是相同的,因为它是通过按字母顺序比较类型名称来实现的 - 但理论上,这可能会改变。

&#34;任意但一致的顺序&#34;规则已从Python 3中转储,因为它真正具有的唯一效果是掩盖错误。当没有定义查找订单的规则时,Python现在告诉您:

>>> 1 < {0}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < set()