Jika Anda tidak memiliki Python 2.6 atau lebih tinggi, alternatifnya adalah menulis eksplisit untuk loop:
def set_list_intersection(set_list):
if not set_list:
return set()
result = set_list[0]
for s in set_list[1:]:
result &= s
return result
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print set_list_intersection(set_list)
# Output: set([1])
Anda juga dapat menggunakan reduce
:
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print reduce(lambda s1, s2: s1 & s2, set_list)
# Output: set([1])
Namun, banyak programmer Python tidak menyukainya, termasuk Guido sendiri :
Sekitar 12 tahun yang lalu, Python mendapatkan lambda, mengurangi (), filter () dan peta (), milik (saya percaya) seorang hacker Lisp yang merindukan mereka dan mengirimkan patch yang berfungsi. Namun, terlepas dari nilai PR, saya pikir fitur ini harus dipotong dari Python 3000.
Jadi sekarang kurangi (). Ini sebenarnya yang paling saya benci, karena, terlepas dari beberapa contoh yang melibatkan + atau *, hampir setiap kali saya melihat panggilan pengurangan () dengan argumen fungsi non-sepele, saya perlu mengambil pena dan kertas untuk diagram apa yang sebenarnya dimasukkan ke dalam fungsi itu sebelum saya mengerti apa yang seharusnya dilakukan pengurangan (). Jadi dalam pikiran saya, penerapan pengurangan () cukup banyak terbatas pada operator asosiatif, dan dalam semua kasus lainnya lebih baik untuk menuliskan lingkaran akumulasi secara eksplisit.
reduce
"terbatas pada operator asosiatif", yang berlaku dalam kasus ini.reduce
sangat sering sulit untuk diketahui, tetapi&
tidak terlalu buruk.set_list and reduce(set.intersection, set_list)
result
kosong.Di sini saya menawarkan fungsi generik untuk beberapa set persimpangan yang mencoba memanfaatkan metode terbaik yang tersedia:
Guido mungkin tidak suka
reduce
, tapi aku agak menyukainya :)sumber
sets
alih-alih mencoba mengaksessets[0]
dan menangkapIndexError
.a_set
digunakan pada pengembalian akhir.return reduce(sets[0], sets[1:]) if sets else set()
?try
/except
harus dihindari jika Anda bisa. Ini bau kode, tidak efisien, dan dapat menyembunyikan masalah lain.Jawaban set.intesection Jean-François Fabre (* list_of_sets) jelas merupakan yang paling Pyhtonic dan merupakan jawaban yang diterima.
Bagi mereka yang ingin menggunakan mengurangi, berikut ini juga akan berfungsi:
reduce(set.intersection, list_of_sets)
sumber