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}
sumber
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}
The 1
dan True
setara dan dianggap duplikat. Demikian juga 0
dan False
setara juga:
>>> 1 == True
True
>>> 0 == False
True
Ketika beberapa nilai yang setara ditemukan, set membuat yang pertama terlihat:
>>> {0, False}
{0}
>>> {False, 0}
{False}
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 == 1
dan 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.
Dengan Python, False
dan 0
dianggap setara, as are True
dan 1
. Karena True
dan 1
dianggap 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, set1
digunakan sebagai set pertama, jadi kita mendapatkan 1
set yang dihasilkan. Di set kedua, True
ada di set pertama, begitu True
juga termasuk dalam hasil.
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 .
Operator perbandingan ( ==
, !=
) ditentukan untuk boolean True
dan False
untuk mencocokkan 1 dan 0.
Itu sebabnya, di serikat set, ketika memeriksa apakah True
sudah ada di set baru, itu mendapat jawaban yang benar:
>>> True in {1}
True
>>> 1 in {True}
True