Lebih
Mencari indeks dari item diberikan daftar yang berisi hal di Python
Untuk daftar ["anu", "bar", "baz"]
dan item dalam daftar "bar"
, bagaimana saya mendapatkan indeks (1) dalam Python?
2865
29
Referensi: Struktur Data > Lebih pada List
Peringatan mengikuti
Perhatikan bahwa sementara ini mungkin terbersih cara untuk menjawab pertanyaan sewaktu diminta,
index
adalah agak lemah komponen daridaftar
API, dan aku bisa't ingat kapan terakhir kali aku menggunakannya dalam kemarahan. It's telah menunjukkan kepada saya di komentar bahwa karena jawaban ini lebih berat dirujuk, harus dibuat lebih lengkap. Beberapa peringatan tentangdaftar.index
ikuti. Hal ini mungkin layak awalnya mengambil melihat docstring untuk itu:Waktu linier-kompleksitas dalam daftar panjang
Sebuah
index
panggilan pemeriksaan setiap elemen dari daftar dalam urutan, sampai menemukan yang cocok. Jika daftar anda lebih lama, dan anda don't tahu kira-kira di mana dalam daftar itu terjadi, pencarian ini bisa menjadi hambatan. Dalam hal ini, anda harus mempertimbangkan struktur data yang berbeda. Perhatikan bahwa jika anda tahu kira-kira di mana untuk menemukan pertandingan, anda dapat memberikanindex
petunjuk. Misalnya, dalam cuplikan ini,l.index(999_999, 999_990, 1_000_000)
kira-kira lima kali lipat lebih cepat daripada lurusl.index(999_999)
, karena mantan hanya untuk mencari 10 entri, sedangkan yang kedua mencari juta:Hanya mengembalikan indeks dari pertandingan pertama untuk argumen
Panggilan untuk
index
pencarian melalui daftar di urutan sampai menemukan yang cocok, dan berhenti di sana. Jika anda berharap untuk kebutuhan indeks lebih banyak pertandingan, anda harus menggunakan daftar pemahaman, atau generator ekspresi.Sebagian besar tempat di mana saya pernah akan digunakan
index
, saya sekarang menggunakan daftar pemahaman atau generator ekspresi karena mereka're lebih generalizable. Jadi jika anda're mempertimbangkan untuk mencapaiindex
, lihatlah ini sangat baik python fitur.Melempar jika elemen tidak ada dalam daftar
Panggilan untuk
index
hasilValueError
jika item's tidak hadir.Jika barang yang mungkin tidak ada dalam daftar, anda harus baik
item di my_list
(bersih, mudah dibaca pendekatan), atauindex
memanggilmencoba/kecuali
blok yang menangkapValueError
(mungkin lebih cepat, setidaknya ketika daftar untuk pencarian lebih lama, dan item ini biasanya hadir.)Satu hal yang benar-benar membantu dalam belajar Python adalah dengan menggunakan bantuan interaktif fungsi:
yang sering akan menyebabkan anda untuk metode yang anda cari.
Mayoritas jawaban menjelaskan bagaimana untuk menemukan indeks tunggal, tetapi metode mereka tidak kembali beberapa indeks jika item dalam daftar beberapa kali. Gunakan
menghitung()
:Index()
fungsi hanya kembali kejadian pertama, sedangkanmenghitung()
mengembalikan semua kejadian.Sebagai daftar pemahaman:
Berikut ini's juga kecil lain larutan dengan
itertools.count()
(yang cukup banyak pendekatan yang sama seperti menghitung):Ini lebih efisien untuk yang lebih besar daftar dari menggunakan
menghitung()
:Untuk mendapatkan semua indeks:
index()
mengembalikan pertama indeks nilai!Masalah akan timbul jika elemen tidak ada dalam daftar. Fungsi ini menangani masalah ini:
Anda harus menetapkan kondisi untuk memeriksa apakah elemen anda'kembali mencari di daftar
Semua fungsi yang diusulkan di sini mereproduksi melekat bahasa perilaku tetapi tidak jelas apa yang's terjadi.
Mengapa menulis fungsi dengan pengecualian penanganan jika bahasa yang menyediakan metode untuk melakukan apa yang anda inginkan itu sendiri?
Jika anda ingin semua indeks, maka anda dapat menggunakan NumPy:
Hal ini jelas, mudah dibaca solusi.
Nah, yakin, ada's metode indeks, yang mengembalikan indeks dari kemunculan pertama:
Ada beberapa masalah dengan metode ini:
ValueError
Tidak ada nilai-nilai
Jika nilai bisa hilang, anda perlu untuk menangkap
ValueError
.Anda dapat melakukannya dengan reusable definisi seperti ini:
Dan menggunakannya seperti ini:
Dan kelemahan dari ini adalah bahwa anda mungkin akan memiliki untuk memeriksa jika nilai yang dikembalikan
adalah
atautidak
Tidak ada:Lebih dari satu nilai dalam daftar
Jika anda bisa memiliki lebih banyak kejadian, anda'll tidak dapatkan informasi yang lengkap dengan
daftar.index
:Anda mungkin menghitung ke daftar pemahaman indeks:
Jika anda tidak memiliki kejadian, anda dapat memeriksa bahwa dengan boolean cek hasil, atau hanya melakukan apa-apa jika anda loop atas hasil:
Baik data munging dengan panda
Jika anda memiliki panda, anda dapat dengan mudah mendapatkan informasi ini dengan Serangkaian objek:
Perbandingan check akan kembali serangkaian boolean:
Melewati serangkaian boolean untuk seri melalui subskrip notasi, dan anda mendapatkan hanya yang cocok anggota:
Jika anda ingin hanya indeks, indeks atribut kembali serangkaian bilangan bulat:
Dan jika anda ingin mereka dalam daftar atau tuple, hanya melewati mereka untuk konstruktor:
Ya, anda bisa menggunakan daftar pemahaman dengan menghitung juga, tapi yang's hanya tidak elegan, dalam pendapat saya - anda'kembali melakukan tes untuk kesetaraan dalam Python, bukannya membiarkan builtin kode yang ditulis dalam C mengatasinya:
Ini adalah sebuah XY masalah?
Mengapa anda pikir anda butuhkan indeks diberikan sebuah elemen dalam daftar?
Jika anda sudah tahu nilai, mengapa kau peduli di mana itu adalah di daftar?
Jika nilai isn't ada, mengejar
ValueError
agak verbose - dan aku lebih memilih untuk menghindari itu.I'm biasanya iterasi daftar lagian, jadi saya'll biasanya menyimpan pointer ke setiap informasi yang menarik, mendapatkan indeks dengan menghitung.
Jika anda're munging data, anda mungkin harus menggunakan panda - yang telah jauh lebih elegan alat-alat dari Python murni workarounds I've ditampilkan.
Saya tidak ingat membutuhkan
daftar.indeks
, diriku sendiri. Namun, saya telah melihat melalui Python library standar, dan saya melihat beberapa menggunakan untuk itu.Ada banyak, banyak kegunaan untuk itu dalam
idlelib
, untuk GUI dan teks parsing.Kata kunci
modul menggunakannya untuk menemukan komentar penanda dalam modul untuk secara otomatis regenerasi daftar kata kunci di dalamnya melalui metaprogramming.Di Lib/mailbox.py tampaknya akan menggunakan itu seperti yang diperintahkan pemetaan:
dan
Di Lib/http/cookiejar.py, tampaknya dapat digunakan untuk mendapatkan bulan berikutnya:
Di Lib/tarfile.py mirip dengan distutils untuk mendapatkan sepotong up untuk item:
Di Lib/pickletools.py:
Apa penggunaan ini tampaknya memiliki kesamaan adalah bahwa mereka tampaknya beroperasi pada daftar dibatasi ukuran (penting karena O(n) waktu pencarian untuk
daftar.index
), dan mereka're sebagian besar digunakan dalam parsing (dan UI dalam kasus Idle).Sementara ada penggunaan-kasus untuk itu, mereka cukup jarang. Jika anda menemukan diri anda mencari jawaban ini, tanyakan pada diri anda jika apa yang anda're lakukan adalah yang paling langsung penggunaan alat-alat yang disediakan oleh bahasa untuk kasus penggunaan anda.
Semua indeks dengan
zip
fungsi:Mendapatkan semua kejadian dan posisi satu atau lebih (identik) item dalam daftar
Dengan menghitung(alist) anda dapat menyimpan elemen pertama (n) yang merupakan indeks dari daftar ketika unsur x sama dengan apa yang anda mencari.
Let's membuat fungsi kita findindex
Fungsi ini mengambil item dan daftar sebagai argumen dan mengembalikan posisi item dalam daftar, seperti yang kita lihat sebelumnya.
Output
Sederhana
Output:
Pilihan lain
Hanya anda dapat pergi dengan
Dan sekarang untuk sesuatu yang sama sekali berbeda...
... seperti mengkonfirmasikan keberadaan item sebelum mendapatkan indeks. Hal yang baik tentang pendekatan ini adalah fungsi yang selalu menampilkan daftar indeks-bahkan jika itu adalah daftar kosong. Bekerja dengan string juga.Ketika disisipkan ke interaktif python jendela:
Update
Setelah satu tahun dari kepala-down python pengembangan, aku'm sedikit malu dengan asli saya menjawab, sehingga untuk mengatur catatan lurus, salah satu pasti bisa menggunakan kode di atas; namun, banyak lebih idiomatik cara untuk mendapatkan perilaku yang sama akan menggunakan daftar pemahaman, bersama dengan menghitung() fungsi.
Sesuatu seperti ini:
Yang, ketika disisipkan ke interaktif python jendela hasil:
Dan sekarang, setelah meninjau pertanyaan ini dan semua jawaban, saya menyadari bahwa ini adalah apa yang FMc yang disarankan dalam nya jawaban sebelumnya. Pada saat saya awalnya menjawab pertanyaan ini, saya didn't bahkan melihat ** yang menjawab, karena saya tidak't memahaminya. Saya berharap bahwa saya agak lebih verbose contoh akan membantu pemahaman.
Jika satu baris kode di atas masih doesn't masuk akal untuk anda, saya sangat menyarankan anda Google 'python daftar pemahaman' dan mengambil beberapa menit untuk membiasakan diri. It's hanya salah satu dari banyak fitur canggih yang membuatnya sukacita untuk menggunakan Python untuk mengembangkan kode.
Varian pada jawaban dari FMc dan user7177 akan memberikan dict yang dapat mengembalikan semua indeks untuk setiap entri:
Anda juga bisa menggunakan ini sebagai salah satu kapal untuk mendapatkan semua indeks untuk single entry. Tidak ada jaminan untuk efisiensi, meskipun saya tidak menggunakan set(a) untuk mengurangi jumlah kali lambda disebut.
Solusi ini tidak sekuat orang lain, tetapi jika anda're pemula dan hanya tahu tentang `untuk'loops itu's masih mungkin untuk menemukan pertama indeks dari item sambil menghindari ValueError:
Mencari indeks dari item x dalam daftar L:
Ini menyumbang jika string tidak ada dalam daftar juga, jika isn't dalam daftar maka lokasi = -1