刚才我在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}}
答案 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 < b
或b < a
。 {0}
和{1}
都不会相互比较,因此min
会给您不一致的答案。
您看到的其他结果是因为Python定义混合类型的顺序的规则。 set
和int
不具有可比性 - 这两种类型都没有定义用于与另一种进行比较的规则。这导致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()