Katakanlah saya punya dua set()
s:
a = {('1', '2', '3', 'a'), ('1', '2', '4', 'a'), ('1', '2', '5', 'b')}
b = {('1', '2', '3', 'b'), ('1', '2', '4', 'b'), ('1', '2', '6', 'b')}
Sekarang, yang ingin saya lakukan adalah menemukan perbedaan set b \ a
tetapi mengabaikan elemen terakhir dari setiap tuple. Jadi seperti melakukan sesuatu seperti ini:
a = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '5')}
b = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '6')}
In[1]: b - a
Out[1]: {('1', '2', '6')}
Output yang diharapkan:
b \ a = {('1', '2', '6', 'b')}
Apakah ada cara yang jelas / pythonic untuk mencapai ini tanpa harus secara manual mengulangi setiap set dan memeriksa masing-masing tuple[:3]
?
python
python-2.7
set
Grajdeanu Alex.
sumber
sumber
set
dan menimpa operasi perbedaan. Tidak ada solusi out-of-the-box yang saya tahu dan saya ragu ada.aa = { t[:3] for t in a }
tuple
dan timpa operator perbedaanJawaban:
Inilah cara Anda dapat menulis kelas Anda sendiri untuk mengesampingkan perilaku hashing normal tuple:
dengan output
Untuk mengubah cara tuple berperilaku, kita harus memodifikasi cara tuple di-hash.
Dari sini ,
Jadi untuk membuat hashing mengabaikan elemen terakhir, kita harus membebani metode dunder
__eq__
dan secara__hash__
tepat. Ini tidak berakhir menjadi sangat sulit karena yang harus kita lakukan adalah memotong elemen terakhir dan kemudian mendelegasikannya ke metode normal yang sesuaituple
.Bacaan lebih lanjut:
sumber
:)
. Sungguh itu hanya menggabungkan potongan-potongan operator kelebihan dan bagaimana hashing bekerja di Python.Inilah satu pendekatan yang mendefinisikan
a
danb
dengan daftar daripada set, karena menurut saya solusi yang paling mudah adalah pengindeksanb
:sumber
Set berfungsi dengan baik. Data Anda yang tidak berfungsi dengan benar. Jika mereka terlihat berbeda tetapi sebenarnya sama, maka tentukan tipe data yang berperilaku seperti yang Anda inginkan. Kemudian mengatur bekerja dengan baik pada dirinya sendiri.
sumber
__repr__
dan__hash__
dalam hal tupel, tetapi tidak__eq__
. Bukankah lebih pendek untuk menggunakan tuple di sini juga? Bahkan, Anda bisa menggunakan slicing di sini dan di__hash__
untuk mempersingkat kode lebih lanjut.