Jawaban di bawah ini sepertinya salah bagi saya. Apa yang terjadi jika suatu nomor diulang dalam kedua daftar, tentunya Anda ingin tahu bahwa (?) (Mis., Katakanlah kedua daftar memiliki '5' dua kali) Setiap solusi menggunakan set akan segera menghapus semua item yang diulang dan Anda akan kehilangan info itu.
Sebagai catatan kehati-hatian, pemahaman daftar tidak selalu merupakan pilihan yang lebih cepat. Untuk set yang lebih besar (di mana kinerja kemungkinan besar menjadi masalah) perbandingan bitwise ( &) atau set(a).intersection(b)akan secepat atau lebih cepat dari daftar pemahaman.
Joshmaker
24
Catatan lain untuk berhati-hati: pemahaman daftar menemukan nilai-nilai yang muncul di kedua posisi yang SAMA (inilah yang dimaksud oleh SilentGhost dengan "urutan signifikan"). Solusi persimpangan yang ditetapkan juga akan menemukan kecocokan pada posisi BERBEDA. Ini adalah jawaban untuk 2 pertanyaan yang sangat berbeda ... (pertanyaan op bersifat mendua yang ditanyakan)
drevicko
Bagaimana Anda melakukan ini jika daftar Anda adalah daftar daftar yaitu a = [[0,0], [1,0]] dan b = [[2,3], [0,0]]
Schneems
3
Apa yang akan menjadi kompleksitas waktu dari contoh pertama set(a) & set(b)?
AdjunctProfessorFalcon
Catatan, ini tidak berfungsi jika kedua set kosong dan Anda mengharapkan perbandingan untuk lulus. Jadi ubah ke "(atur (a) dan atur (b)) atau (bukan a dan bukan b)"
Jawaban ini memiliki kinerja algoritmik yang baik, karena hanya satu dari daftar (lebih pendek yang lebih disukai) yang diubah menjadi satu set untuk pencarian cepat, dan daftar lainnya dilacak mencari item-itemnya di set.
u0b34a0f6ae
18
bool(set(a).intersection(b))untuk TrueatauFalse
Akshay
6
Jawaban ini lebih fleksibel dan mudah dibaca, karena orang mungkin perlu differenceatau union.
Shihe Zhang
Bagaimana jika saya memiliki objek sebagai elemen daftar dan hanya ingin kecocokan parsial, yaitu, hanya beberapa atribut yang harus cocok agar dianggap sebagai objek yang cocok?
CGFoX
Apakah ada perbedaan kinerja untuk .intersection()vs &?
brandonbanks
106
Tes kinerja cepat yang menunjukkan solusi Lutz adalah yang terbaik:
import time
def speed_test(func):def wrapper(*args,**kwargs):
t1 = time.time()for x in xrange(5000):
results = func(*args,**kwargs)
t2 = time.time()print'%s took %0.3f ms'%(func.func_name,(t2-t1)*1000.0)return results
return wrapper
@speed_testdef compare_bitwise(x, y):
set_x = frozenset(x)
set_y = frozenset(y)return set_x & set_y
@speed_testdef compare_listcomp(x, y):return[i for i, j in zip(x, y)if i == j]@speed_testdef compare_intersect(x, y):return frozenset(x).intersection(y)# Comparing short lists
a =[1,2,3,4,5]
b =[9,8,7,6,5]
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)# Comparing longer listsimport random
a = random.sample(xrange(100000),10000)
b = random.sample(xrange(100000),10000)
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)
Ini adalah hasil di mesin saya:
# Short list:
compare_bitwise took 10.145 ms
compare_listcomp took 11.157 ms
compare_intersect took 7.461 ms
# Long list:
compare_bitwise took 11203.709 ms
compare_listcomp took 17361.736 ms
compare_intersect took 6833.768 ms
Jelas, setiap tes kinerja buatan harus diambil dengan sebutir garam, tetapi karena set().intersection()jawabannya setidaknya secepat solusi lain, dan juga yang paling mudah dibaca, itu harus menjadi solusi standar untuk masalah umum ini.
Set sebenarnya menghapus pengulangan, jadi dalam kasus saya tidak akan bekerja
rgralma
@rgralma membuat yang baru setdari yang sudah ada listtidak akan menghapus apa pun dari aslinya list. Jika Anda ingin logika khusus untuk menangani duplikat dalam daftar, saya pikir Anda perlu mengajukan pertanyaan baru karena jawabannya harus spesifik untuk bagaimana Anda ingin duplikat ditangani.
Joshmaker
67
Saya lebih suka jawaban berdasarkan set, tapi tetap saja ada yang berhasil
Menurut dokumen - ... menghalangi konstruksi rawan kesalahan seperti Set ('abc') & 'cbs' yang mendukung Set yang lebih mudah dibaca ('abc'). Intersection ('cbs'). - docs.python.org/library/sets.html
Aaron Newton
5
cara lain yang sedikit lebih fungsional untuk memeriksa daftar persamaan untuk daftar 1 (lst1) dan daftar 2 (lst2) di mana objek memiliki kedalaman satu dan yang menjaga urutannya adalah:
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Donald Duck
4
Dapat menggunakan itertools.product juga.
>>> common_elements=[]>>>for i in list(itertools.product(a,b)):...if i[0]== i[1]:... common_elements.append(i[0])
you can |for set union and&for set intersection.for example:
set1={1,2,3}
set2={3,4,5}print(set1&set2)
output=3
set1={1,2,3}
set2={3,4,5}print(set1|set2)
output=1,2,3,4,5
curly braces in the answer.
Jawaban:
Bukan yang paling efisien, tetapi sejauh ini cara yang paling jelas untuk melakukannya adalah:
jika pesanan signifikan, Anda dapat melakukannya dengan daftar pemahaman seperti ini:
(hanya berfungsi untuk daftar berukuran sama, yang menyiratkan signifikansi pesanan).
sumber
&
) atauset(a).intersection(b)
akan secepat atau lebih cepat dari daftar pemahaman.set(a) & set(b)
?Gunakan set.intersection () , cepat dan mudah dibaca.
sumber
bool(set(a).intersection(b))
untukTrue
atauFalse
difference
atauunion
..intersection()
vs&
?Tes kinerja cepat yang menunjukkan solusi Lutz adalah yang terbaik:
Ini adalah hasil di mesin saya:
Jelas, setiap tes kinerja buatan harus diambil dengan sebutir garam, tetapi karena
set().intersection()
jawabannya setidaknya secepat solusi lain, dan juga yang paling mudah dibaca, itu harus menjadi solusi standar untuk masalah umum ini.sumber
set
dari yang sudah adalist
tidak akan menghapus apa pun dari aslinyalist
. Jika Anda ingin logika khusus untuk menangani duplikat dalam daftar, saya pikir Anda perlu mengajukan pertanyaan baru karena jawabannya harus spesifik untuk bagaimana Anda ingin duplikat ditangani.Saya lebih suka jawaban berdasarkan set, tapi tetap saja ada yang berhasil
sumber
Cara termudah untuk melakukannya adalah dengan menggunakan set :
sumber
Cara cepat:
sumber
sumber
Anda juga dapat mencoba ini, dengan menyimpan elemen umum dalam daftar baru.
sumber
Apakah Anda ingin duplikat? Jika tidak, Anda sebaiknya menggunakan set sebagai gantinya:
sumber
cara lain yang sedikit lebih fungsional untuk memeriksa daftar persamaan untuk daftar 1 (lst1) dan daftar 2 (lst2) di mana objek memiliki kedalaman satu dan yang menjaga urutannya adalah:
sumber
sumber
Dapat menggunakan itertools.product juga.
sumber
Kamu bisa menggunakan
sumber
Kamu bisa menggunakan:
Keluaran:
sumber
Jika Anda menginginkan nilai boolean:
sumber
Solusi berikut berfungsi untuk setiap urutan item daftar dan juga mendukung kedua daftar dengan panjang yang berbeda.
sumber
np.intersect1d(list1, list2)
Menggunakan
__and__
metode atribut juga berfungsi.atau sederhana
sumber
sumber
&
operator di set sudah dijawab oleh SilentGhost dalam jawaban yang diterimaSaya hanya menggunakan yang berikut ini dan itu berhasil untuk saya:
ini kemudian akan mencetak 5 dalam kasus Anda. Mungkin kinerja yang tidak bijaksana.
sumber