Saya mencoba menemukan cara singkat untuk melihat apakah ada item berikut dalam daftar, tetapi upaya pertama saya tidak berhasil. Selain menulis fungsi untuk mencapai ini, adalah cara singkat untuk memeriksa apakah salah satu dari beberapa item ada dalam daftar.
>>> a = [2,3,4]
>>> print (1 or 2) in a
False
>>> print (2 or 1) in a
True
a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] print( (1 and 2) in b ,(2 and 1) in b ,(1 and 2) in c ,(2 and 1) in c, sep='\n')
is True False False TrueJawaban:
Daftar kosong dan set kosong adalah False, sehingga Anda dapat menggunakan nilai secara langsung sebagai nilai kebenaran.
sumber
any
dapat kembali lebih awal segera setelah menemukanTrue
nilai - itu tidak harus membangun seluruh daftar terlebih dahuluAh, Tobias kau mengalahkanku karenanya. Saya sedang memikirkan sedikit variasi pada solusi Anda ini:
sumber
x in long for x in short
vsx in short for x in long
)a
danb
memiliki panjang yang sama, max dan min akan kembali meninggalkan sebagian-daftar, yang membuatany()
panggilan beroperasi melalui daftar yang sama di kedua sisi. Jika Anda benar-benar membutuhkan memeriksa panjang, membalik urutan daftar dalam panggilan kedua:any(x in max(a, b, key=len) for x in (b, a, key=len))
.any(x in max(a, b, key=len) for x in min(b, a, key=len))
(melewatkan min).Mungkin sedikit lebih malas:
sumber
any
dapat kembali lebih awal, sedangkan versi Anda harus membangun seluruh daftar dari pemahaman sebelumany
dapat menggunakannya. @ jawaban user89788 sedikit lebih baik karena tanda kurung ganda tidak diperlukanPikirkan tentang apa yang sebenarnya dikatakan kode!
Itu mungkin harus menjelaskannya. :) Python rupanya mengimplementasikan "malas atau", yang seharusnya tidak mengejutkan. Melakukannya sesuatu seperti ini:
Pada contoh pertama,
x == 1
dany == 2
. Dalam contoh kedua, itu sebaliknya. Itu sebabnya ia mengembalikan nilai yang berbeda tergantung pada urutannya.sumber
Versi kode golf. Pertimbangkan menggunakan set jika masuk akal untuk melakukannya. Saya menemukan ini lebih mudah dibaca daripada pemahaman daftar.
sumber
1 baris tanpa daftar daftar.
sumber
Terbaik yang bisa saya kemukakan:
sumber
Dalam python 3 kita bisa mulai menggunakan tanda bintang yang belum dibuka. Diberikan dua daftar:
Sunting: sertakan saran alkanen
sumber
Ketika Anda berpikir "centang untuk melihat apakah a dalam b", pikirkan hash (dalam hal ini, set). Cara tercepat adalah dengan hash daftar yang ingin Anda periksa, dan kemudian periksa setiap item di sana.
Inilah sebabnya mengapa jawaban Joe Koberg cepat: memeriksa set persimpangan sangat cepat.
Ketika Anda tidak memiliki banyak data, membuat set bisa membuang-buang waktu. Jadi, Anda dapat membuat satu set daftar dan cukup memeriksa setiap item:
Ketika jumlah item yang ingin Anda periksa kecil, perbedaannya dapat diabaikan. Tetapi periksa banyak angka terhadap daftar besar ...
tes:
kecepatan:
Metode yang secara konsisten cepat adalah membuat satu set (dari daftar), tetapi persimpangan bekerja pada data besar menentukan yang terbaik!
sumber
Dalam beberapa kasus (misalnya elemen daftar unik), operasi yang ditetapkan dapat digunakan.
Atau, menggunakan set.isdisjoint () ,
sumber
Ini akan melakukannya dalam satu baris.
sumber
Saya mengumpulkan beberapa solusi yang disebutkan dalam jawaban lain dan dalam komentar, kemudian menjalankan tes kecepatan.
not set(a).isdisjoint(b)
ternyata yang tercepat, ternyata juga tidak banyak melambat ketika hasilnyaFalse
.Masing-masing dari tiga tes menjalankan sampel kecil dari kemungkinan konfigurasi
a
danb
. Waktu dalam mikrodetik.sumber
Saya harus mengatakan bahwa situasi saya mungkin bukan yang Anda cari, tetapi mungkin memberikan alternatif bagi pemikiran Anda.
Saya telah mencoba metode set () dan any () tetapi masih memiliki masalah dengan kecepatan. Jadi saya ingat Raymond Hettinger mengatakan semuanya dengan python adalah kamus dan gunakan dict kapan pun Anda bisa. Jadi itulah yang saya coba.
Saya menggunakan defaultdict dengan int untuk menunjukkan hasil negatif dan menggunakan item dalam daftar pertama sebagai kunci untuk daftar kedua (dikonversi ke defaultdict). Karena Anda memiliki pencarian instan dengan dict, Anda langsung tahu apakah item itu ada di defaultdict. Saya tahu Anda tidak selalu bisa mengubah struktur data untuk daftar kedua Anda, tetapi jika Anda bisa dari awal, maka itu jauh lebih cepat. Anda mungkin harus mengubah list2 (daftar yang lebih besar) ke defaultdict, di mana kunci adalah nilai potensial yang ingin Anda periksa dari daftar kecil, dan nilainya adalah 1 (klik) atau 0 (tanpa klik, default).
sumber
Sederhana.
sumber
a
dalam daftarb
.