a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c
output aktual: [1,3,5,6]
output yang diharapkan:[1,3,5]
Bagaimana kita bisa mencapai operasi boolean DAN (persimpangan daftar) pada dua daftar?
python
arrays
intersection
csguy11
sumber
sumber
a and b
berfungsi seperti pernyataan berikut dari dokumentasi menyebutkannya: " Ekspresix and y
pertama mengevaluasix
; jikax
salah, nilainya dikembalikan; jika tidak,y
dievaluasi dan nilai yang dihasilkan dikembalikan. "Jawaban:
Jika pesanan tidak penting dan Anda tidak perlu khawatir tentang duplikat maka Anda dapat menggunakan set persimpangan:
sumber
a = [1,1,2,3,4,5]
danb = [1,1,3,5,6]
kemudian persimpangan[1,1,3,5]
tetapi dengan metode di atas itu akan menghasilkan hanya satu1
yaitu[1, 3, 5]
apa yang akan menjadi cara menulis untuk melakukannya?intersection
biasanya dipahami sebagai berbasis set . Anda mencari hewan yang sedikit berbeda - dan Anda mungkin perlu melakukannya secara manual dengan mengurutkan setiap daftar dan menggabungkan hasilnya - dan menyimpan dups dalam penggabungan.Menggunakan daftar pemahaman adalah hal yang sangat jelas bagi saya. Tidak yakin tentang kinerja, tetapi setidaknya hal-hal tetap daftar.
[x for x in a if x in b]
Atau "semua nilai x yang ada di A, jika nilai X ada di B".
sumber
b
satu set dan Anda akan memiliki O (n)Jika Anda mengonversi yang lebih besar dari dua daftar menjadi satu set, Anda bisa mendapatkan persimpangan set itu dengan iterable menggunakan
intersection()
:sumber
list(set(a) & set(b))
Buat satu set yang lebih besar:
Kemudian,
akan melakukan apa yang Anda inginkan (melestarikan
b
pemesanan, bukana
- tidak dapat selalu mempertahankan keduanya ) dan melakukannya dengan cepat . (Menggunakanif x in a
sebagai kondisi dalam pemahaman daftar juga akan bekerja, dan menghindari kebutuhan untuk membangun_auxset
, tetapi sayangnya untuk daftar panjang substansial akan jauh lebih lambat).Jika Anda ingin hasilnya diurutkan, alih-alih mempertahankan urutan daftar, cara yang lebih rapi mungkin:
sumber
Berikut adalah beberapa kode Python 2 / Python 3 yang menghasilkan informasi waktu untuk metode berbasis daftar dan set untuk menemukan persimpangan dua daftar.
Algoritma pemahaman daftar murni adalah O (n ^ 2), karena
in
pada daftar adalah pencarian linier. Algoritme berbasis set adalah O (n), karena pencarian pencarian adalah O (1), dan pembuatan kreasi adalah O (n) (dan mengonversi satu set ke daftar juga O (n)). Jadi untuk n yang cukup besar , algoritma set-based lebih cepat, tetapi untuk n kecil overhead pembuatan set membuatnya lebih lambat daripada algoritma comp murni daftar.keluaran
Dihasilkan menggunakan mesin inti tunggal 2GHz dengan RAM 2GB yang menjalankan Python 2.6.6 pada Debian rasa Linux (dengan Firefox berjalan di latar belakang).
Angka-angka ini hanya panduan kasar, karena kecepatan aktual dari berbagai algoritma dipengaruhi secara berbeda oleh proporsi elemen yang ada di kedua daftar sumber.
sumber
Seharusnya bekerja seperti mimpi. Dan, jika Anda bisa, gunakan set bukannya daftar untuk menghindari semua jenis ini berubah!
sumber
Cara fungsional dapat dicapai dengan menggunakan
filter
danlambda
operator.Sunting: Memfilter x yang ada di list1 dan list, mengatur perbedaan juga dapat dicapai dengan menggunakan:
Edit2: python3
filter
mengembalikan objek filter, mengenkapsulasi denganlist
mengembalikan daftar output.sumber
list(filter(lambda x:x in list1, list2))
untuk mendapatkannya sebagai daftar.Ini adalah contoh ketika Anda membutuhkan Setiap elemen dalam hasil akan muncul sebanyak yang ditampilkan di kedua array.
sumber
Mungkin terlambat tapi saya hanya berpikir saya harus berbagi untuk kasus di mana Anda diminta untuk melakukannya secara manual (tunjukkan kerja - haha) ATAU ketika Anda membutuhkan semua elemen untuk muncul sebanyak mungkin atau ketika Anda juga membutuhkannya untuk menjadi unik .
Harap perhatikan bahwa tes juga telah ditulis untuk itu.
sumber
Jika, menurut Boolean AND, maksud Anda adalah item yang muncul di kedua daftar, misalnya persimpangan, maka Anda harus melihat pada Python
set
danfrozenset
tipe.sumber
Anda juga dapat menggunakan penghitung! Itu tidak mempertahankan pesanan, tetapi akan mempertimbangkan duplikat:
sumber