Asumsikan saya memiliki ini:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
dan dengan mencari "Pam" sebagai nama, saya ingin mengambil kamus terkait: {name: "Pam", age: 7}
Bagaimana cara mencapai ini?
python
search
dictionary
Hellnar
sumber
sumber
[item for item in dicts if item["name"] == "Pam"][0]
?enumerate()
untuk menghasilkan indeks berjalan:next(i for i, item in enumerate(dicts) if item["name"] == "Pam")
.Ini bagi saya cara yang paling pythonic:
hasil (dikembalikan sebagai daftar di Python 2):
Catatan: Dalam Python 3, objek filter dikembalikan. Jadi solusi python3 adalah:
sumber
len()
, Anda harus memanggillist()
hasilnya terlebih dahulu. Atau: stackoverflow.com/questions/19182188/…r
adalahlist
next(filter(lambda x: x['name'] == 'Pam', dicts))
Jawaban @ Frédéric Hamidi luar biasa. Dalam Python 3.x sintaks untuk
.next()
sedikit berubah. Jadi sedikit modifikasi:Seperti yang disebutkan dalam komentar oleh @Matt, Anda dapat menambahkan nilai default seperti:
sumber
Anda dapat menggunakan pemahaman daftar :
sumber
sumber
def search(list, key, value): for item in list: if item[key] == value: return item
Saya menguji berbagai metode untuk menelusuri daftar kamus dan mengembalikan kamus di mana kunci x memiliki nilai tertentu.
Hasil:
Semua tes dilakukan dengan Python 3.6 .4, W7x64.
Hasil:
sumber
Untuk menambahkan sedikit saja ke @ FrédéricHamidi.
Jika Anda tidak yakin kunci ada dalam daftar dicts, sesuatu seperti ini akan membantu:
sumber
item.get("name") == "Pam"
Pernahkah Anda mencoba paket panda? Ini sempurna untuk tugas pencarian semacam ini dan juga dioptimalkan.
Saya telah menambahkan sedikit pembandingan di bawah ini untuk mengilustrasikan runtime lebih cepat panda pada skala yang lebih besar yaitu entri 100k +:
sumber
Ini adalah cara umum untuk mencari nilai dalam daftar kamus:
sumber
Ini adalah salah satu cara ...
sumber
Cukup menggunakan pemahaman daftar:
Kode sampel:
sumber
Anda dapat mencapai ini dengan menggunakan filter dan metode selanjutnya dengan Python.
filter
metode menyaring urutan yang diberikan dan mengembalikan iterator.next
Metode menerima iterator dan mengembalikan elemen berikutnya dalam daftar.Jadi Anda dapat menemukan elemen dengan,
dan hasilnya adalah,
Catatan: Kode di atas akan kembali
None
memetikan jika nama yang kita cari tidak ditemukan.sumber
Pikiran pertama saya adalah Anda mungkin ingin mempertimbangkan membuat kamus kamus ini ... jika, misalnya, Anda akan mencarinya lebih dari beberapa kali.
Namun itu mungkin merupakan optimasi prematur. Apa yang salah dengan:
sumber
sumber
Salah satu cara sederhana menggunakan pemahaman daftar adalah, jika
l
daftarkemudian
sumber
Anda dapat mencoba ini:
sumber
Berikut ini adalah perbandingan menggunakan daftar iterating throuhg, menggunakan filter + lambda atau refactoring (jika diperlukan atau valid untuk kasus Anda) kode Anda untuk dict dicts daripada daftar dicts
Dan hasilnya adalah ini:
Kesimpulan: Jelas memiliki kamus dicts adalah cara yang paling efisien untuk dapat mencari dalam kasus-kasus itu, di mana Anda tahu mengatakan Anda akan mencari dengan id saja. Menariknya menggunakan filter adalah solusi paling lambat.
sumber
Anda harus melalui semua elemen daftar. Tidak ada jalan pintas!
Kecuali di tempat lain Anda menyimpan kamus dari nama-nama yang menunjuk ke item-item dari daftar, tetapi kemudian Anda harus berhati-hati dengan konsekuensi memunculkan elemen dari daftar Anda.
sumber
Saya menemukan utas ini ketika saya mencari jawaban untuk pertanyaan yang sama. Sementara saya menyadari bahwa ini adalah jawaban yang terlambat, saya pikir saya akan berkontribusi jika itu berguna bagi orang lain:
sumber
Sebagian besar (jika tidak semua) implementasi yang diusulkan di sini memiliki dua kelemahan:
Proposisi yang diperbarui:
Mungkin bukan yang paling pythonic, tapi setidaknya sedikit lebih aman.
Pemakaian:
The Inti .
sumber