Czy są jakieś a, b takie, że max (a, b)! = Max (b, a)? [Zamknięte]

11

W Pythonie 3.x, są tam niektóre a, btakie, że max(a, b) != max(b, a)?

ai bpowinien być wbudowanego typu python i nie może zawierać żadnej konwersji.

Typem ai bmoże być: num, float, bool, list, krotka ...

Przykład:

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

źródło
1
twoje pytanie nie jest jasne
seralouk
Nie sądzę, żeby istniała jakaś ... maxwbudowana funkcja, która pobiera iterowalny obiekt jako dane wejściowe. Czyli a,bto samo, b,aco max(a,b)musi być równemax(b,a)
Anwarvic,
1
To dobre pytanie, ale powinieneś je edytować i wyjaśnić bardziej
El.Hum,
2
Twoja edycja ma sens tylko w kontekście Twojego komentarza poniżej najczęściej głosowanej odpowiedzi. Tu i tutaj nie można argumentować, że float('nan')nie jest to typ wbudowany. Zakładam, że „typ wbudowany” oznaczałby wszystko, co możesz stworzyć bez konieczności tworzenia nowego class.
Teepeemm,
2
Jeśli chcesz wykluczyć float('nan'), to dlaczego? Żeby było jasne, możesz zadać pytanie, w którym wykluczasz coś takiego float('nan'), jak chcesz; to nie jest problem. Problem w tym, że nikt nie jest pewien, o co próbujesz zapytać.
Nat

Odpowiedzi:

17

Spełnia wszystkie kryteria:

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

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

To dlatego, że inne niż porównania !=lub isz float("nan")zawsze return false.

Mówiąc bardziej ogólnie, możemy to zrobić, max(a, b) != max(b, a)gdy typ (y) a, bnie zapewniają całkowitego zamówienia. Jak wskazuje Daniel Mesejo, zestawy mają również tę właściwość. W przypadku zestawów <oznacza „ścisłego podzbioru”, ale {1, 2}i {3, 4}ani ścisła podzbiorem drugiego, tak:

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

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

Ten technicznie nie ma, max(a, b) != max(b, a)ponieważ 1 == Truewciąż istnieje zauważalna różnica:

>>> max(True, 1)
True

>>> max(1, True)
1
orlp
źródło
1
WOW ... dlaczego to jest ??
Anwarvic,
7
@ stackFF4, jeśli float("nan")nie jest wbudowany, niż co to jest? Z pewnością jest wbudowany.
sanyash
9
@ stackFF4: float('nan')jest zmiennoprzecinkowy. Jest floattam napisane , więc nie jestem pewien, czego jeszcze się spodziewałeś. Możesz to sprawdzić, typejeśli chcesz.
user2357112 obsługuje Monikę
1
@Anwarvic: Co ciekawe, nie jest to kwestia python, to tak naprawdę sposób implementacji pływaków w sprzęcie. NaN porównuje fałsz ze wszystkim w prawie każdym języku programowania.
Mooing Duck,
2
@Nat: Ale przez większość czasu nikt nie chce wyjątków. To maxzachowanie jest artefaktem definiowania go inaczej niż C fmax(co gwarantuje propagację NaN), zamiast tego jako coś, a<b ? b : aco zawsze powstaje, agdy porównanie jest fałszywe. NaN jest „nieuporządkowany” wrt. jakikolwiek inny numer, tak a < NaNzawsze jest fałszywy, i tak też jestNaN < b
Peter Cordes
5

Zgodnie z dokumentacją użycie maxna zestawach daje niezdefiniowane wyniki:

Odpowiednio, zestawy nie są odpowiednimi argumentami dla funkcji, które zależą od całkowitego uporządkowania (na przykład min (), max () i sorted () dają niezdefiniowane wyniki na podstawie listy zestawów jako danych wejściowych).

Oto przykład,

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

Wynik

True
Dani Mesejo
źródło
Warto tu zauważyć, że „niezdefiniowane wyniki” są prawdopodobnie bardziej rozsądne w Pythonie niż w niektórych innych językach. Prawdopodobnie nie występują żadne demony nosowe i prawdopodobnie nawet nie podniesie to wyjątku. Zwraca tylko dowolną wartość (dla mini max) lub kolejność (dla sorted).
Blckknght,