Adakah beberapa a, b sedemikian rupa sehingga maks (a, b)! = Maks (b, a)? [Tutup]

11

Dalam python 3.x, ada beberapa a, bsehingga max(a, b) != max(b, a)?

adan bharus dari tipe python bawaan dan tidak mengandung konversi apa pun.

Jenis adan bdapat: num, mengambang, bool, daftar, tuple ...

Contoh:

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

sumber
1
pertanyaan Anda tidak jelas
seralouk
Saya tidak berpikir ada ... maxadalah fungsi built-in yang mengambil objek iterable sebagai input. Jadi, a,bsama dengan b,akarenanya max(a,b)harus samamax(b,a)
Anwarvic
1
Ini adalah pertanyaan yang bagus tetapi Anda harus mengeditnya dan menjelaskannya lebih lanjut
El.Hum
2
Suntingan Anda hanya masuk akal dalam konteks komentar Anda di bawah ini sebagai jawaban terbanyak. Di sana dan di sini, Anda gagal untuk berdebat bahwa float('nan')itu bukan tipe bawaan. Saya menganggap "tipe bawaan" akan berarti apa pun yang dapat Anda buat tanpa harus membuat yang baru class.
Teepeemm
2
Jika Anda ingin mengecualikan float('nan'), lalu mengapa? Agar jelas, Anda diizinkan untuk mengajukan pertanyaan yang mengecualikan sesuatu seperti float('nan')jika Anda ingin; bukan itu masalahnya. Masalahnya hanya tidak ada yang yakin apa yang ingin Anda tanyakan.
Nat

Jawaban:

17

Ini memenuhi semua kriteria:

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

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

Ini karena setiap perbandingan selain !=atau isdengan float("nan")selalu mengembalikan false.

Lebih umum, kita dapat memiliki max(a, b) != max(b, a)ketika jenis a, btidak memberikan pesanan total. Seperti yang ditunjukkan Daniel Mesejo, set juga memiliki properti ini. Untuk set <berarti 'subset ketat', tetapi dengan {1, 2}dan {3, 4}tidak ada subset ketat dari yang lain, jadi:

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

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

Yang ini secara teknis tidak ada max(a, b) != max(b, a)karena 1 == True, tetapi masih ada perbedaan yang bisa diamati:

>>> max(True, 1)
True

>>> max(1, True)
1
orlp
sumber
1
WOW ... kenapa begitu ??
Anwarvic
7
@ stackFF4 jika float("nan")tidak built-in, lalu apa? Sudah pasti built-in.
sanyash
9
@ stackFF4: float('nan')adalah float. Dikatakan floatdi sana, jadi saya tidak yakin apa lagi yang Anda harapkan. Anda dapat memeriksanya typejika mau.
user2357112 mendukung Monica
1
@ Anwarvic: Menariknya, ini bukan hal python, ini sebenarnya bagaimana mengapung diimplementasikan dalam perangkat keras. NaN membandingkan false dengan segala sesuatu di hampir setiap bahasa pemrograman.
Mooing Duck
2
@Nat: Tapi tidak ada yang menginginkan pengecualian sebagian besar waktu. Ini maxperilaku adalah artefak mendefinisikan secara berbeda dari C fmax(yang menjamin propagasi NaN), bukan sebagai sesuatu seperti a<b ? b : ayang selalu menghasilkan aketika perbandingan adalah palsu. NaN adalah "unordered" wrt. nomor lain, begitu a < NaNjuga selalu salah, dan begitu pulaNaN < b
Peter Cordes
5

Menurut dokumentasi , menggunakan maxset menghasilkan hasil yang tidak ditentukan:

Dengan demikian, set bukanlah argumen yang sesuai untuk fungsi yang bergantung pada total pemesanan (misalnya, min (), maks (), dan diurutkan () menghasilkan hasil yang tidak ditentukan mengingat daftar set sebagai input).

Berikut ini sebuah contoh,

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

Keluaran

True
Dani Mesejo
sumber
Mungkin perlu dicatat di sini bahwa "hasil yang tidak ditentukan" mungkin lebih waras di Python daripada di beberapa bahasa lain. Tidak ada setan hidung yang mungkin, dan mungkin bahkan tidak akan menimbulkan pengecualian. Itu hanya mengembalikan sebagian besar nilai arbitrer (untuk mindan max) atau memesan (untuk sorted).
Blckknght