有没有一些a、b,使得max(a, b) != max(b, a)?

11
在Python 3.x中,是否存在一些ab,使得max(a, b) != max(b, a)ab应该是Python内置类型,并且不包含任何转换。 ab的类型可以是:数值、浮点数、布尔型、列表、元组等。
示例:
a = 1 # Correct
a = [1, 2] # Correct
a = float('nan') # Wrong

1
你的问题不清楚。 - seralouk
我不认为有任何... max 是一个内置函数,它以可迭代对象作为输入。因此,a,bb,a 是相同的,因此 max(a,b) 必须等于 max(b,a) - Anwarvic
1
这是一个好问题,但您应该编辑并更详细地解释它。 - El.Hum
2
你的编辑只有在最受欢迎的答案下面的评论的背景下才有意义。在那里和这里,你都没有争辩float('nan')不是内置类型。我会认为“内置类型”指的是任何你可以创建而无需创建新的class的东西。 - Teepeemm
2
如果你想排除 float('nan'),那么为什么? 明确一点,如果你想在问题中排除像 float('nan') 这样的东西,那是没有问题的。 问题只是没有人确定你想问什么。 - Nat
在最近的编辑中,您进一步指定了ab都不能涉及“_转换_”,这是什么意思?我的理解是,您希望答案为max(a, b) == max(b, a),并且您想将问题陈述简化到这个等式成立的程度。这是您所追求的正确解释吗?如果是,您可能需要提出一个不同的问题,询问您可以对ab施加哪些约束条件,以使max(a, b) == max(b, a)必须成立。 - Nat
2个回答

17

这满足所有标准:

>>> max(1.0, float("nan"))
1.0

>>> max(float("nan"), 1.0)
nan

这是因为与float("nan")进行除!=is之外的任何比较都会返回false。

更普遍地说,当a, b的类型不能提供全序时,我们可以有max(a, b) != max(b, a)。正如Daniel Mesejo所指出的那样,集合也具有此属性。对于集合,<表示严格子集,但对于{1, 2}{3, 4},它们都不是彼此的严格子集,因此:

>>> max({1, 2}, {3, 4})
{1, 2}

>>> max({3, 4}, {1, 2})
{3, 4}

虽然 1 == True,因此技术上说这个例子没有max(a, b) != max(b, a),但仍有一个明显的区别:

>>> max(True, 1)
True

>>> max(1, True)
1

1
哇...为什么会这样? - Anwarvic
7
如果 float("nan") 不是内置的,那它是什么?但它肯定是内置的。请注意,我会润���内容并使其更加通俗易懂,但不会改变原来的意思。 - sanyassh
9
float('nan')是一个浮点数。因为它上面写着“float”,所以我不确定你还期望它是什么。如果需要,你可以使用type来检查它。 - user2357112
1
@Anwarvic:有趣的是,这不是Python的问题,实际上这是浮点数在硬件中的实现方式。NaN在几乎所有编程语言中与任何东西比较都会返回false。 - Mooing Duck
2
@Nat:但大多数情况下,没有人想要异常。这种“max”行为是因为它与C中的“fmax”定义不同(后者保证NaN传播),而是像“a<b?b:a”这样的东西,当比较为假时总是产生“a”。 NaN在任何其他数字方面都是“无序”的,因此“a < NaN”始终为false,而“NaN < b”也是如此。 - Peter Cordes
显示剩余4条评论

5
根据文档,在集合上使用max会产生未定义的结果:

因此,集合不适用于依赖于全序的函数参数(例如,给定一组集合作为输入,min()、max()和sorted()都会产生未定义的结果)。

以下是一个例子:

a = {1, 2}
b = {2, 3}
print(max(b, a) != max(a, b))

输出

True

在这里值得注意的是,“未定义结果”在Python中可能比其他一些语言更加合理。不太可能出现“鼻妖”,甚至可能不会引发异常。它只返回一个大多数情况下是任意值(对于minmax)或排序(对于sorted)的结果。 - Blckknght

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接