Saya punya daftar dicts:
list = [{'id':'1234','name':'Jason'},
{'id':'2345','name':'Tom'},
{'id':'3456','name':'Art'}]
Bagaimana cara efisien menemukan posisi indeks [0], [1], atau [2] dengan mencocokkan nama = 'Tom'?
Jika ini adalah daftar satu dimensi saya bisa melakukan list.index () tapi saya tidak yakin bagaimana untuk melanjutkan dengan mencari nilai dicts dalam daftar.
{ 'Jason': {'id': '1234'}, 'Tom': {'id': '1245'}, ...}
?){'1234': {'name': 'Jason'}, ...}
. Bukan berarti itu akan membantu kasus penggunaan ini.Jawaban:
Jika Anda perlu mengambil berulang kali dari nama, Anda harus mengindeksnya dengan nama (menggunakan kamus), cara mendapatkan operasi ini akan menjadi O (1) waktu. Sebuah ide:
sumber
next()
untuk ini terasa aneh bagi saya), tujuannya hanya untuk mendapatkan indeks. Juga, ini meningkatkan StopIteration, sedangkanlst.index()
metode Python meningkatkan ValueError.first()
memang terdengar lebih baik. Anda selalu dapat mencoba / kecuali StopIteration dan meningkatkan ValueError sehingga pemanggil memiliki konsistensi. Atau tetapkannext()
default ke -1.SyntaxError: Generator expression must be parenthesized if not sole argument
ketika melakukan itu.next((index for (index, d) in enumerate(lst) if d["name"] == "Tom"), None)
Versi yang mudah dibaca adalah
sumber
str.find()
baik. Anda juga bisa memanggilnyaindex()
dan menaikkanValueError
bukannya mengembalikan -1 jika itu lebih baik.Ini tidak akan efisien, karena Anda harus memeriksa daftar setiap item di dalamnya (O (n)). Jika Anda ingin efisiensi, Anda dapat menggunakan dict dari dicts . Pada pertanyaan, inilah salah satu cara yang mungkin untuk menemukannya (walaupun, jika Anda ingin tetap berpegang pada struktur data ini, sebenarnya lebih efisien menggunakan generator seperti yang ditulis oleh Brent Newey di komentar; lihat juga jawaban tokland):
sumber
Berikut adalah fungsi yang menemukan posisi indeks kamus jika ada.
sumber
Tampaknya paling logis untuk menggunakan kombo filter / indeks:
Dan jika Anda berpikir mungkin ada beberapa pertandingan:
sumber
Jawaban yang ditawarkan oleh @faham bagus sekali, tetapi tidak mengembalikan indeks ke kamus yang berisi nilai. Sebaliknya ia mengembalikan kamus itu sendiri. Berikut ini cara sederhana untuk mendapatkannya: Daftar indeks satu atau lebih jika ada lebih dari satu, atau daftar kosong jika tidak ada:
Keluaran:
Yang saya sukai dari pendekatan ini adalah bahwa dengan edit sederhana Anda bisa mendapatkan daftar indeks dan kamus sebagai tupel. Ini adalah masalah yang saya butuhkan untuk menyelesaikan dan menemukan jawaban ini. Berikut ini, saya menambahkan nilai duplikat di kamus yang berbeda untuk menunjukkan cara kerjanya:
Keluaran:
Solusi ini menemukan semua kamus yang mengandung 'Tom' dalam nilai mereka.
sumber
Satu liner !?
sumber
Untuk tertentu,
more_itertools.locate
menghasilkan posisi item yang memenuhi predikat.more_itertools
adalah perpustakaan pihak ketiga yang mengimplementasikan resep itertools di antara alat-alat lain yang bermanfaat.sumber
sumber