Bagaimana cara perbandingan tuple bekerja di Python?

178

Saya telah membaca buku pemrograman Core Python , dan penulis menunjukkan contoh seperti:

(4, 5) < (3, 5) # Equals false

Jadi, saya bertanya-tanya, bagaimana / mengapa itu sama dengan palsu? Bagaimana python membandingkan kedua tupel ini?

Btw, itu tidak dijelaskan dalam buku ini.

Paulo
sumber

Jawaban:

190

Tuple dibandingkan posisi dengan posisi: item pertama dari tuple pertama dibandingkan dengan item pertama dari tuple kedua; jika mereka tidak sama (yaitu yang pertama lebih besar atau lebih kecil dari yang kedua) maka itu adalah hasil perbandingan, jika item kedua dianggap, maka yang ketiga dan seterusnya.

Lihat Operasi Urutan Umum :

Urutan dengan tipe yang sama juga mendukung perbandingan. Secara khusus, tupel dan daftar dibandingkan secara leksikografis dengan membandingkan elemen yang sesuai. Ini berarti bahwa untuk membandingkan sama, setiap elemen harus membandingkan sama dan dua urutan harus dari jenis yang sama dan memiliki panjang yang sama.

Juga Membandingkan Nilai untuk perincian lebih lanjut:

Perbandingan leksikografis antara koleksi bawaan berfungsi sebagai berikut:

  • Untuk dua koleksi untuk membandingkan sama, mereka harus dari jenis yang sama, memiliki panjang yang sama, dan setiap pasangan elemen yang terkait harus membandingkan sama (misalnya, [1,2] == (1,2)salah karena jenisnya tidak sama).
  • Koleksi yang mendukung perbandingan pesanan diurutkan sama dengan elemen tidak sama pertama mereka (misalnya, [1,2,x] <= [1,2,y]memiliki nilai yang sama dengan x <= y). Jika elemen yang sesuai tidak ada, koleksi yang lebih pendek dipesan terlebih dahulu (misalnya, [1,2] < [1,2,3]benar).

Jika tidak sama, urutannya disusun sama dengan elemen yang berbeda pertama. Misalnya, cmp ([1,2, x], [1,2, y]) mengembalikan sama dengan cmp (x, y). Jika elemen yang sesuai tidak ada, urutan yang lebih pendek dianggap lebih kecil (misalnya, [1,2] <[1,2,3] mengembalikan True).

Catatan 1 : <dan >tidak berarti "lebih kecil dari" dan "lebih besar dari" tetapi "sebelum" dan "sesudah": jadi (0, 1) "sebelum" (1, 0).

Catatan 2 : tupel tidak boleh dianggap sebagai vektor dalam ruang n-dimensi , dibandingkan menurut panjangnya.

Catatan 3 : merujuk ke pertanyaan /programming/36911617/python-2-tuple-comparison : jangan berpikir bahwa tuple "lebih besar" daripada yang lain hanya jika ada elemen pertama lebih besar dari yang sesuai satu di yang kedua.

Mengenakan
sumber
4
Ini bisa menyesatkan ketika berbicara tentang <dan >. Misalnya, (0, 1) < (1, 0)evaluasi ke True.
Tidak ada
4
@ CMCDragonkai - ya. coba: x = tuple([0 for _ in range(n)])dan lakukan hal yang sama untuk y. Pengaturan n = 100, 1000, 10.000, dan 100.000 dan running %timeit x==ymemberikan nilai waktu masing-masing 0,5, 4,6, 43,9, dan 443 mikrodetik, yang hampir mendekati O (n) seperti yang bisa Anda dapatkan secara praktis.
Michael Scott Cuthbert
8
@ J.Money mengapa menurut Anda itu bisa menyesatkan?
Don
1
@CharlieParker <dan >tidak berarti "lebih kecil dari itu" dan "lebih besar dari itu" tetapi "datang sebelum" dan "datang setelah": jadi (0, 1)"datang sebelum"(1, 0)
Don
3
@ Don Saya kira itu tidak jelas bagi kita jenis pemesanan untuk memaksakan pada tuple. Saya kira python hanya memperlakukannya sebagai angka dengan memeriksa angka signifikan terbesar pertama dan bergerak untuk memecahkan mati ... (dengan cara yang bijak)
Charlie Parker
20

The dokumentasi Python tidak menjelaskannya.

Tuple dan daftar dibandingkan secara leksikografis menggunakan perbandingan elemen yang sesuai. Ini berarti bahwa untuk membandingkan sama, setiap elemen harus membandingkan sama dan dua urutan harus dari tipe yang sama dan memiliki panjang yang sama.

Keith
sumber
Halaman yang sekarang ditautkan dari jawaban ini tampaknya tidak mengandung teks yang dikutip.
plugwash
0

The python 2,5 dokumentasi menjelaskan dengan baik.

Tuple dan daftar dibandingkan secara leksikografis menggunakan perbandingan elemen yang sesuai. Ini berarti bahwa untuk membandingkan sama, setiap elemen harus membandingkan sama dan dua urutan harus dari tipe yang sama dan memiliki panjang yang sama.

Jika tidak sama, urutannya disusun sama dengan elemen yang berbeda pertama. Misalnya, cmp ([1,2, x], [1,2, y]) mengembalikan sama dengan cmp (x, y). Jika elemen yang sesuai tidak ada, urutan yang lebih pendek dipesan terlebih dahulu (misalnya, [1,2] <[1,2,3]).

Sayangnya halaman itu tampaknya telah menghilang dalam dokumentasi untuk versi yang lebih baru.

plugwash
sumber
0
Saya memiliki beberapa kebingungan sebelum mengenai perbandingan integer, jadi saya akan menjelaskannya untuk menjadi lebih ramah dengan contoh

a = ('A','B','C') # see it as the string "ABC" b = ('A','B','D')

A dikonversi ke ASCII terkait yang ord('A') #65sama untuk elemen lainnya

Jadi, >> a>b # True Anda dapat menganggapnya sebagai membandingkan antara string (Ini persis, sebenarnya)

hal yang sama juga berlaku untuk bilangan bulat.

x = (1,2,2) # see it the string "123" y = (1,2,3) x > y # False

karena (1 tidak lebih besar dari 1, pindah ke berikutnya, 2 tidak lebih besar dari 2, pindah ke 2 berikutnya kurang dari tiga -secara grafis -)

Poin kuncinya disebutkan dalam jawaban di atas

menganggapnya sebagai elemen sebelum elemen lain menurut abjad tidak lebih besar dari elemen dan dalam hal ini menganggap semua elemen tupel sebagai satu string.

Bishoy Abd
sumber
2
(1,2,3) > (1,2,2)memberikanTrue
Vishal Singh