¿Hay alguna a, b tal que max (a, b)! = Max (b, a)? [cerrado]

11

En python 3.x, ¿hay alguno a, btal que max(a, b) != max(b, a)?

ay bdebe ser de tipo python incorporado y no contener ninguna conversión.

El tipo de ay bpuede ser: num, float, bool, list, tuple ...

Ejemplo:

a = 1 # Correct
a = [1, 2] # Correct
a = float('nan') # Wrong

fuente
1
su pregunta no está clara
seralouk
No creo que haya ninguna ... maxes una función incorporada que toma un objeto iterable como entrada. Entonces, a,bes lo mismo que b,apor lo tanto max(a,b)debe ser igualmax(b,a)
Anwarvic
1
Esta es una buena pregunta, pero deberías editarla y explicarla más
El.Hum
2
Su edición solo tiene sentido en el contexto de su comentario debajo de la respuesta más votada. Aquí y aquí, no puede argumentar que float('nan')no es un tipo incorporado. Supongo que "tipo incorporado" significaría cualquier cosa que pueda crear sin tener que crear uno nuevo class.
Teepeemm
2
Si desea excluir float('nan'), ¿por qué? Para ser claros, puede hacer una pregunta en la que excluye algo como float('nan')si lo desea; Ese no es el problema. El problema es que nadie está seguro de lo que estás tratando de preguntar.
Nat

Respuestas:

17

Esto satisface todos los criterios:

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

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

Esto se debe a que cualquier comparación que no sea !=o iscon float("nan")siempre devuelve falso.

En términos más generales, podemos tener max(a, b) != max(b, a)cuando los tipos de a, bno proporcionan un pedido total. Como señala Daniel Mesejo, los conjuntos también tienen esta propiedad. Para conjuntos <significa 'subconjunto estricto', pero con {1, 2}y {3, 4}ninguno es un subconjunto estricto del otro, entonces:

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

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

Este técnicamente no tiene max(a, b) != max(b, a)porque 1 == True, pero todavía hay una diferencia observable:

>>> max(True, 1)
True

>>> max(1, True)
1
orlp
fuente
1
WOW ... ¿por qué es eso?
Anwarvic
77
@ stackFF4 si float("nan")no está integrado, ¿qué es? Ciertamente está incorporado.
sanyash
99
@ stackFF4: float('nan')es un flotador. Dice floatallí, así que no estoy seguro de qué más esperabas que fuera. Puedes consultarlo typesi quieres.
user2357112 es compatible con Monica el
1
@Anwarvic: Curiosamente, no es una cosa de Python, en realidad es cómo se implementan los flotadores en el hardware. NaN compara falso con todo en casi todos los lenguajes de programación.
Mooing Duck
2
@Nat: Pero nadie quiere excepciones la mayor parte del tiempo. Este maxcomportamiento es un artefacto de definirlo de manera diferente a C fmax(que garantiza la propagación de NaN), en cambio, como algo a<b ? b : aque siempre se produce acuando la comparación es falsa. NaN es wrt "desordenada". cualquier otro número, por a < NaNlo que siempre es falso, y también lo esNaN < b
Peter Cordes
5

Según la documentación , el uso maxen conjuntos produce resultados indefinidos:

En consecuencia, los conjuntos no son argumentos apropiados para funciones que dependen del orden total (por ejemplo, min (), max () y sorted () producen resultados indefinidos dada una lista de conjuntos como entradas).

Aquí hay un ejemplo,

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

Salida

True
Dani Mesejo
fuente
Vale la pena señalar aquí que los "resultados indefinidos" son probablemente más seguros en Python que en otros lenguajes. No es probable que haya demonios nasales , y probablemente ni siquiera planteará una excepción. Simplemente devuelve un valor principalmente arbitrario (para miny max) u ordenando (para sorted).
Blckknght