tl; dr
Sebuah generator ekspresi mungkin adalah solusi yang paling performant dan sederhana untuk masalah Anda:
l = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
result = next((i for i, v in enumerate(l) if v[0] == 53), None)
Penjelasan
Ada beberapa jawaban yang memberikan solusi sederhana untuk pertanyaan ini dengan pemahaman daftar. Meskipun jawaban-jawaban ini benar sekali, namun tidak optimal. Bergantung pada kasus penggunaan Anda, mungkin ada manfaat yang signifikan untuk membuat beberapa modifikasi sederhana.
Masalah utama yang saya lihat dengan menggunakan pemahaman daftar untuk kasus penggunaan ini adalah bahwa seluruh daftar akan diproses, meskipun Anda hanya ingin menemukan 1 elemen .
Python menyediakan konstruksi sederhana yang ideal di sini. Ini disebut ekspresi generator . Berikut ini contohnya:
l = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
next((i for i, v in enumerate(l) if v[0] == 53), None)
Kita dapat mengharapkan metode ini untuk melakukan pada dasarnya sama dengan pemahaman daftar dalam contoh sederhana kita, tetapi bagaimana jika kita bekerja dengan kumpulan data yang lebih besar? Di situlah keuntungan menggunakan metode generator berperan. Daripada membuat daftar baru, kami akan menggunakan daftar Anda yang ada sebagai iterable kami, dan menggunakan next()
untuk mendapatkan item pertama dari generator kami.
Mari kita lihat bagaimana metode ini bekerja secara berbeda pada beberapa kumpulan data yang lebih besar. Ini adalah daftar besar, terbuat dari 10.000.000 + 1 elemen, dengan target kita di awal (terbaik) atau akhir (terburuk). Kami dapat memverifikasi bahwa kedua daftar ini akan bekerja sama menggunakan pemahaman daftar berikut:
Pemahaman daftar
"Kasus terburuk"
worst_case = ([(False, 'F')] * 10000000) + [(True, 'T')]
print [i for i, v in enumerate(worst_case) if v[0] is True]
"Kasus terbaik"
best_case = [(True, 'T')] + ([(False, 'F')] * 10000000)
print [i for i, v in enumerate(best_case) if v[0] is True]
Ekspresi generator
Inilah hipotesis saya untuk generator: kita akan melihat bahwa generator akan berkinerja lebih baik secara signifikan dalam kasus terbaik, tetapi serupa dalam kasus terburuk. Peningkatan kinerja ini sebagian besar disebabkan oleh fakta bahwa generator dievaluasi secara malas, yang berarti generator hanya akan menghitung apa yang diperlukan untuk menghasilkan nilai.
Kasus terburuk
Kasus terbaik
best_case = [(True, 'T')] + ([(False, 'F')] * 10000000)
print next((i for i, v in enumerate(best_case) if v[0] == True), None)
APA?! Kasus terbaik menghancurkan pemahaman daftar, tetapi saya tidak mengharapkan kasus terburuk kami mengungguli pemahaman daftar sedemikian rupa. Bagaimana itu? Terus terang, saya hanya bisa berspekulasi tanpa penelitian lebih lanjut.
Ambil semua ini dengan sebutir garam, saya belum menjalankan profil yang kuat di sini, hanya beberapa pengujian yang sangat mendasar. Ini seharusnya cukup untuk memahami bahwa ekspresi generator lebih berkinerja untuk jenis pencarian daftar ini.
Perhatikan bahwa ini semua dasar, python built-in. Kami tidak perlu mengimpor apa pun atau menggunakan perpustakaan apa pun.
Saya pertama kali melihat teknik ini untuk mencari di kursus Udacity cs212 dengan Peter Norvig.