Ci sono alcuni a, b tali che max (a, b)! = Max (b, a)? [chiuso]


11

In Python 3.x ce ne sono alcuni a, btali max(a, b) != max(b, a)?

ae bdovrebbe essere di tipo Python incorporato e non contenere alcuna conversione.

Il tipo di ae bpuò essere: num, float, bool, list, tuple ...

Esempio:

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

1
la tua domanda non è chiara
seralouk,

Non penso che ci sia ... maxè una funzione integrata che accetta come input un oggetto iterabile . Quindi, a,bè lo stesso che b,aquindi max(a,b)deve essere ugualemax(b,a)
Anwarvic il

1
Questa è una buona domanda, ma dovresti modificarla e spiegarla di più
El.Hum

2
La tua modifica ha senso solo nel contesto del tuo commento sotto la risposta più votata. Lì e qui, non riesci a sostenere che float('nan')non è un tipo incorporato. Suppongo che "tipo incorporato" significherebbe qualsiasi cosa tu possa creare senza doverne creare una nuova class.
Teepeemm,

2
Se vuoi escludere float('nan'), allora perché? Per essere chiari, ti è permesso fare una domanda in cui escludi qualcosa come float('nan')se lo desideri; non è questo il problema. Il problema è che nessuno è sicuro di cosa stai cercando di chiedere.
Nat

Risposte:


17

Questo soddisfa tutti i criteri:

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

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

Questo perché eventuali confronti diversi da !=o iscon float("nan")restituiscono sempre false.

Più in generale, possiamo avere max(a, b) != max(b, a)quando i tipi di a, bnon forniscono un ordine totale. Come sottolinea Daniel Mesejo, anche i set hanno questa proprietà. Per set <significa "sottoinsieme rigoroso", ma con {1, 2}e {3, 4}nessuno dei due è un sottoinsieme rigoroso dell'altro, quindi:

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

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

Questo tecnicamente non ha max(a, b) != max(b, a)perché 1 == True, ma c'è ancora una differenza osservabile:

>>> max(True, 1)
True

>>> max(1, True)
1

1
WOW ... perché?
Anwarvic,

7
@ stackFF4 se float("nan")non è integrato, di cosa si tratta? È sicuramente integrato.
sanyash,

9
@ stackFF4: float('nan')è un float. Dice floatproprio lì, quindi non sono sicuro di cos'altro ti aspettavi che fosse. Puoi verificarlo con typese lo desideri.
user2357112 supporta Monica il

1
@Anwarvic: È interessante notare che non è una cosa Python, è in realtà come i float sono implementati nell'hardware. NaN confronta falso con tutto in quasi tutti i linguaggi di programmazione.
Mooing Duck,

2
@Nat: Ma nessuno vuole eccezioni per la maggior parte del tempo. Questo maxcomportamento è un artefatto di definirlo in modo diverso da C fmax(che garantisce la propagazione di NaN), invece come qualcosa di simile a<b ? b : ache produce sempre aquando il confronto è falso. NaN è wrt "non ordinato". qualsiasi altro numero, quindi a < NaNè sempre falso, e così èNaN < b
Peter Cordes,

5

Secondo la documentazione , l'utilizzo maxsui set produce risultati indefiniti:

Di conseguenza, gli insiemi non sono argomenti appropriati per le funzioni che dipendono dall'ordinamento totale (ad esempio, min (), max () e ordinati () producono risultati indefiniti dato un elenco di insiemi come input).

Ecco un esempio,

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

Produzione

True

Vale la pena notare qui che i "risultati indefiniti" sono probabilmente più sani in Python che in alcune altre lingue. Nessun demone nasale è probabile e probabilmente non solleverà nemmeno un'eccezione. Restituisce semplicemente un valore per lo più arbitrario (per mine max) o ordinando (per sorted).
Blckknght,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.