Gabungan 2 set tidak berisi semua item


94

Kenapa ketika saya mengubah urutan dua set dalam serikat di bawah, saya mendapatkan hasil yang berbeda?

set1 = {1, 2, 3}
set2 = {True, False}

print(set1 | set2)
# {False, 1, 2, 3}

print(set2 | set1)
#{False, True, 2, 3}

Jawaban:


110

Mengapa union () tidak berisi semua item

The 1dan Truesetara dan dianggap duplikat. Demikian juga 0dan Falsesetara juga:

>>> 1 == True
True
>>> 0 == False
True

Nilai ekuivalen mana yang digunakan

Ketika beberapa nilai yang setara ditemukan, set membuat yang pertama terlihat:

>>> {0, False}
{0}
>>> {False, 0}
{False}

Cara untuk membuat nilai menjadi berbeda

Untuk membuatnya diperlakukan berbeda, simpan saja (value, type)berpasangan:

>>> set1 = {(1, int), (2, int), (3, int)}
>>> set2 = {(True, bool), (False, bool)}
>>> set1 | set2
{(3, <class 'int'>), (1, <class 'int'>), (2, <class 'int'>),
 (True, <class 'bool'>), (False, <class 'bool'>)}
>>> set1 & set2
set()

Cara lain untuk membuat nilai berbeda adalah dengan menyimpannya sebagai string:

>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()

Semoga ini bisa membersihkan misteri dan menunjukkan jalan ke depan :-)


Diselamatkan dari komentar:

Ini adalah teknik standar untuk memecah persamaan tipe silang (yaitu 0.0 == 0, True == 1dan Decimal(8.5) == 8.5). Teknik ini digunakan dalam modul ekspresi reguler Python 2.7 untuk memaksa regex unicode di-cache secara jelas dari regex str yang setara. Teknik ini juga digunakan di Python 3 untuk functools.lru_cache () jika parameter yang diketik adalah benar.

Jika OP membutuhkan sesuatu selain relasi ekivalen default, maka beberapa relasi baru perlu didefinisikan. Bergantung pada kasus penggunaan, itu bisa jadi case-insensitivity untuk string, normalisasi untuk unicode, tampilan visual (hal-hal yang terlihat berbeda dianggap berbeda), identitas (tidak ada dua objek berbeda yang dianggap sama), pasangan nilai / tipe, atau lainnya fungsi yang mendefinisikan hubungan kesetaraan. Dengan contoh spesifik OP, tampaknya dia mengharapkan perbedaan menurut jenis atau perbedaan visual.


20

Dengan Python, Falsedan 0dianggap setara, as are Truedan 1. Karena Truedan 1dianggap memiliki nilai yang sama, hanya satu di antaranya yang dapat hadir dalam satu himpunan dalam waktu yang sama. Yang mana tergantung pada urutan mereka ditambahkan ke set in. Pada baris pertama, set1digunakan sebagai set pertama, jadi kita mendapatkan 1set yang dihasilkan. Di set kedua, Trueada di set pertama, begitu Truejuga termasuk dalam hasil.


6

Jika Anda melihat https://docs.python.org/3/library/stdtypes.html#boolean-values bagian 4.12.10. Nilai Boolean:

Nilai Boolean adalah dua objek konstanta False dan True . Mereka digunakan untuk mewakili nilai-nilai kebenaran (meskipun nilai-nilai lain juga dapat dianggap salah atau benar). Dalam konteks numerik (misalnya ketika digunakan sebagai argumen untuk operator aritmatika), mereka masing-masing berperilaku seperti bilangan bulat 0 dan 1 .


4

Operator perbandingan ( ==, !=) ditentukan untuk boolean Truedan Falseuntuk mencocokkan 1 dan 0.

Itu sebabnya, di serikat set, ketika memeriksa apakah Truesudah ada di set baru, itu mendapat jawaban yang benar:

>>> True in {1}
True
>>> 1 in {True}
True
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.