Saya telah menemukan ini:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
tetapi kadang-kadang itu tidak bekerja dengan semua item saya, seolah-olah mereka tidak dikenali dalam daftar (ketika itu adalah daftar string).
Apakah ini cara yang paling 'pythonic' untuk menemukan item dalam daftar if x in l:
:?
myList
.Jawaban:
Adapun pertanyaan pertama Anda: kode itu baik-baik saja dan harus berfungsi jika
item
sama dengan salah satu elemen di dalamnyamyList
. Mungkin Anda mencoba menemukan string yang tidak sama persis dengan salah satu item atau mungkin Anda menggunakan nilai float yang menderita ketidaktepatan.Adapun pertanyaan kedua Anda: Sebenarnya ada beberapa cara yang mungkin jika "menemukan" hal-hal dalam daftar.
Memeriksa apakah ada sesuatu di dalam
Ini adalah use case yang Anda gambarkan: Memeriksa apakah ada sesuatu di dalam daftar atau tidak. Seperti yang Anda ketahui, Anda dapat menggunakan
in
operator untuk itu:Memfilter koleksi
Artinya, menemukan semua elemen dalam urutan yang memenuhi kondisi tertentu. Anda dapat menggunakan daftar pemahaman atau ekspresi generator untuk itu:
Yang terakhir akan mengembalikan generator yang dapat Anda bayangkan sebagai semacam daftar malas yang hanya akan dibangun segera setelah Anda mengulanginya. Omong-omong, yang pertama persis sama dengan
di Python 2. Di sini Anda dapat melihat fungsi tingkat tinggi di tempat kerja. Dalam Python 3,
filter
tidak mengembalikan daftar, tetapi objek seperti generator.Menemukan kejadian pertama
Jika Anda hanya menginginkan hal pertama yang cocok dengan suatu kondisi (tetapi Anda belum tahu apa itu), boleh saja menggunakan for for (mungkin menggunakan
else
klausa juga, yang sebenarnya tidak terlalu terkenal). Anda juga bisa menggunakanyang akan mengembalikan pertandingan pertama atau menaikkan
StopIteration
jika tidak ada yang ditemukan. Atau, Anda dapat menggunakanMenemukan lokasi suatu barang
Untuk daftar, ada juga
index
metode yang kadang-kadang bisa berguna jika Anda ingin tahu di mana elemen tertentu ada dalam daftar:Namun, perhatikan bahwa jika Anda memiliki duplikat,
.index
selalu kembalikan indeks terendah: ......Jika ada duplikat dan Anda ingin semua indeks maka Anda dapat menggunakannya
enumerate()
:sumber
if x in list
adalah tidak hal yang orang-orang mengeluh tidak menjadi built-in fungsi. Mereka mengeluh tentang fakta bahwa tidak ada cara eksplisit untuk menemukan kemunculan pertama sesuatu dalam daftar yang cocok dengan kondisi tertentu. Tetapi seperti yang dinyatakan dalam jawaban saya,next()
dapat (ab) digunakan untuk itu.[list comprehension...][0]
pendekatanindex()
meneleponkey
yang berfungsi seperti yangkey
diterima olehmax()
; misalnya:index(list, key=is_prime)
.Jika Anda ingin menemukan satu elemen atau
None
menggunakan bawaannext
, itu tidak akan naikStopIteration
jika item tidak ditemukan dalam daftar:sumber
next
mengambil iterator sebagai parameter pertama dan daftar / tuple BUKAN iterator. Jadi harusfirst_or_default = next(iter([x for x in lst if ...]), None)
melihat docs.python.org/3/library/functions.html#next(x for x in lst if ...)
generator atas daftarlst
(yang merupakan iterator). Jika yanext(iter([x for x in lst if ...]), None)
, Anda harus membuat daftar[x for x in lst if ...]
, yang akan menjadi operasi yang jauh lebih mahal.if
dalam lambda & Anda dapat menulisfind(fn,list)
biasanya alih-alih mengaburkan kode generator.Meskipun jawaban dari Niklas B. cukup komprehensif, ketika kami ingin menemukan item dalam daftar, terkadang berguna untuk mendapatkan indeksnya:
sumber
Menemukan kejadian pertama
Ada resep untuk itu di
itertools
:Misalnya, kode berikut ini menemukan nomor ganjil pertama dalam daftar:
sumber
Alternatif lain: Anda dapat memeriksa apakah suatu item ada dalam daftar
if item in list:
, tetapi ini adalah pesanan O (n). Jika Anda berurusan dengan daftar besar item dan yang perlu Anda ketahui adalah apakah sesuatu adalah anggota daftar Anda, Anda dapat mengonversi daftar menjadi satu set pertama dan mengambil keuntungan dari pencarian waktu yang konstan :Tidak akan menjadi solusi yang tepat dalam setiap kasus, tetapi untuk beberapa kasus ini mungkin memberi Anda kinerja yang lebih baik.
Perhatikan bahwa membuat set dengan
set(my_list)
juga O (n), jadi jika Anda hanya perlu melakukan ini sekali maka tidak lebih cepat untuk melakukannya dengan cara ini. Jika Anda perlu memeriksa keanggotaan berulang kali, maka ini akan menjadi O (1) untuk setiap pencarian setelah pembuatan set awal.sumber
Anda mungkin ingin menggunakan salah satu dari dua pencarian yang mungkin saat bekerja dengan daftar string:
jika elemen daftar sama dengan item ('contoh' ada di ['satu', 'contoh', 'dua']):
if item in your_list: some_function_on_true()
'ex' di ['one', 'ex', 'two'] => Benar
'ex_1' di ['one', 'ex', 'two'] => Salah
jika elemen daftar seperti item ('ex' ada di ['satu,' contoh ',' dua '] atau' example_1 'ada di [' satu ',' contoh ',' dua ']):
matches = [el for el in your_list if item in el]
atau
matches = [el for el in your_list if el in item]
maka cukup periksa
len(matches)
atau baca jika perlu.sumber
Definisi dan Penggunaan
yang
count()
metode mengembalikan jumlah elemen dengan nilai yang ditentukan.Sintaksis
contoh:
Contoh pertanyaan:
sumber
Alih-alih menggunakan
list.index(x)
yang mengembalikan indeks x jika ditemukan dalam daftar atau mengembalikan#ValueError
pesan jika x tidak ditemukan, Anda bisa menggunakanlist.count(x)
yang mengembalikan jumlah kemunculan x dalam daftar (validasi bahwa x memang ada dalam daftar) atau mengembalikan 0 sebaliknya (dengan tidak adanya x). Yang keren tentang itucount()
adalah tidak merusak kode Anda atau mengharuskan Anda untuk melemparkan pengecualian ketika x tidak ditemukansumber
Jika Anda akan memeriksa apakah nilai ada dalam koleksi sekali maka menggunakan operator 'dalam' baik-baik saja. Namun, jika Anda akan memeriksa lebih dari sekali maka saya sarankan menggunakan modul bisect. Perlu diingat bahwa menggunakan data modul dua bagian harus diurutkan. Jadi Anda mengurutkan data sekali dan kemudian Anda dapat menggunakan dua bagian. Menggunakan modul bisect pada mesin saya sekitar 12 kali lebih cepat daripada menggunakan operator 'dalam'.
Berikut adalah contoh kode menggunakan sintaksis Python 3.8 dan di atas:
Keluaran:
sumber
Periksa tidak ada ruang putih tambahan / yang tidak diinginkan dalam item dari daftar string. Itu alasan yang dapat mengganggu menjelaskan item tidak dapat ditemukan.
sumber