Hari ini, saya menemukan dict
metode get
yang, diberikan kunci dalam kamus, mengembalikan nilai yang terkait.
Untuk tujuan apa fungsi ini berguna? Jika saya ingin menemukan nilai yang terkait dengan kunci dalam kamus, saya bisa melakukannya dict[key]
, dan mengembalikan hal yang sama:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
python
dictionary
stensootla
sumber
sumber
dictionary["foo"]
dandictionary.get("foo")
berperilaku berbeda.dictionary.get("Age")
sama dengan menulisdictionary["Age"] or None
sehingga secara implisit menangani pengecualian KeyErrordictionary['non-existent key'] or None
harus dan masih meningkatkanKeyError
untuk saya (hingga v3.6). Bisakah Anda menjelaskan maksud Anda?Jawaban:
Ini memungkinkan Anda untuk memberikan nilai default jika kunci tidak ada:
mengembalikan
default_value
(apa pun yang Anda pilih), sedangkanakan menaikkan
KeyError
.Jika dihilangkan,
default_value
adalahNone
sedemikian rupakembali
None
sama sepertiakan.
sumber
dictionary.get("bogus") or my_default
? Saya telah melihat orang menggunakannya dalam beberapa kasus dan saya bertanya-tanya apakah ada keuntungan menggunakan salah satu daripada yang lain (selain keterbacaan)"bogus"
adalah kunci dalamdictionary
dandictionary.get("bogus")
pengembalian nilai yang mengevaluasi ke False dalam konteks boolean (yaitu nilai Falsey), seperti 0 atau string kosong,''
makadictionary.get("bogus") or my_default
akan mengevaluasimy_default
sedangkandictionary.get("bogus", my_default)
akan kembali nilai Falsey. Jadi tidak,dictionary.get("bogus") or my_default
tidak setara dengandictionary.get("bogus", my_default)
. Yang digunakan tergantung pada perilaku yang Anda inginkan.x = {'a':0}
. Kemudianx.get('a', 'foo')
kembali0
tetapix.get('a') or 'foo'
kembali'foo'
.dictionary.get('key')
: Ini bisa membingungkan jika nilai dalam kamusNone
. Tanpa menentukan nilai kembali (argumen opsional kedua) tidak ada cara untuk memverifikasi jika kunci tidak ada atau jika nilainyaNone
. Dalam kasus khusus ini saya akan mempertimbangkan menggunakantry-except-KeyError
.Seperti telah disebutkan
get
metode ini berisi parameter tambahan yang menunjukkan nilai yang hilang. Dari dokumentasiContohnya bisa
Seperti yang disebutkan di sini ,
Sebelumnya
get
jauh lebih lambat, Namun sekarang kecepatannya hampir sebanding dengan keuntungan tambahan mengembalikan nilai default. Tetapi untuk menghapus semua pertanyaan kami, kami dapat menguji pada daftar yang cukup besar (Perhatikan bahwa tes ini mencakup mencari semua kunci yang valid saja)Sekarang pengaturan waktu kedua fungsi ini menggunakan
timeit
Seperti yang bisa kita lihat, pencarian lebih cepat daripada pencarian karena tidak ada fungsi pencarian. Ini bisa dilihat melalui
dis
Ini akan berguna setiap kali Anda ingin memberikan nilai default setiap kali Anda mencari kamus. Ini mengurangi
Untuk satu baris,
val = dic.get(key,def_val)
Setiap kali Anda ingin mengembalikan
KeyError
pernyataan bahwa kunci tertentu tidak tersedia. Mengembalikan nilai default juga membawa risiko bahwa nilai default tertentu juga bisa menjadi kunci!Iya! Kita perlu mengimplementasikan
__missing__
subclass dict.Contoh program bisa
Demonstrasi kecil bisa
sumber
if k in dict and dict[k]:
vsif dict.get(k):
. Ini mencakup situasi ketika kita perlu memeriksa apakah kunci ada, dan jika 'ya' - apa nilai ?, sesuatu seperti:dict = {1: '', 2: 'some value'}
.dictionary.get(value, long_function())
orang dapat mempertimbangkan untuk menggunakandictionary.get(value) or long_function()
get
mengambil nilai opsional kedua. Jika kunci yang ditentukan tidak ada dalam kamus Anda, maka nilai ini akan dikembalikan.Jika Anda tidak memberikan parameter kedua,
None
akan dikembalikan.Jika Anda menggunakan pengindeksan seperti pada
dictionary['Year']
, kunci tidak ada akan naikKeyError
.sumber
Saya akan memberikan contoh praktis dalam mengikis data web menggunakan python, banyak kali Anda akan mendapatkan kunci tanpa nilai, dalam kasus tersebut Anda akan mendapatkan kesalahan jika Anda menggunakan kamus ['kunci'], sedangkan kamus.get ('kunci ',' return_otherwise ') tidak punya masalah.
Demikian pula, saya akan menggunakan '' .join (daftar) sebagai lawan dari daftar [0] jika Anda mencoba untuk menangkap nilai tunggal dari daftar.
semoga membantu.
[Sunting] Ini adalah contoh praktis:
Katakanlah, Anda memanggil API, yang mengembalikan file JOSN yang Anda perlu parsing. JSON pertama terlihat seperti berikut:
JOSN kedua adalah seperti ini:
Perhatikan bahwa JSON kedua tidak memiliki kunci "submitdate_ts", yang cukup normal dalam struktur data apa pun.
Jadi ketika Anda mencoba mengakses nilai kunci itu dalam satu lingkaran, dapatkah Anda menyebutnya dengan yang berikut:
Anda bisa, tetapi itu akan memberi Anda kesalahan traceback untuk baris JSON kedua, karena kuncinya tidak ada.
Cara pengkodean yang tepat ini, bisa sebagai berikut:
{'x': Tidak Ada} ada untuk menghindari kesalahan tingkat kedua. Tentu saja Anda dapat membangun lebih banyak toleransi kesalahan ke dalam kode jika Anda melakukan pengikisan. Seperti pertama yang menentukan kondisi if
sumber
Tujuannya agar Anda dapat memberikan nilai default jika kunci tidak ditemukan, yang sangat berguna
sumber
Salah satu penggunaan khusus menghitung dengan kamus. Misalkan Anda ingin menghitung jumlah kemunculan setiap elemen dalam daftar yang diberikan. Cara umum untuk melakukannya adalah membuat kamus di mana kunci adalah elemen dan nilai adalah jumlah kemunculannya.
Dengan menggunakan
.get()
metode ini, Anda dapat membuat kode ini lebih ringkas dan jelas:sumber
Gotcha yang harus diperhatikan saat menggunakan
.get()
:Jika kamus berisi kunci yang digunakan dalam panggilan ke
.get()
dan nilainya adalahNone
,.get()
metode akan kembaliNone
bahkan jika nilai standar diberikan.Misalnya, pengembalian berikut
None
, tidak'alt_value'
seperti yang diharapkan:.get()
Nilai kedua hanya dikembalikan jika kunci yang disediakan TIDAK dalam kamus, bukan jika nilai balik panggilan ituNone
.sumber
d.get('key') or 'alt_value'
jika Anda tahu itu mungkinNone
0. Ringkasan
Dibandingkan dengan
dict[key]
,dict.get
memberikan nilai mundur ketika mencari kunci.1. Definisi
get (key [, default]) 4. Built-in Types - Dokumentasi Python 3.6.4rc1
Kembalikan nilai untuk kunci jika kunci ada di kamus, kalau tidak default. Jika default tidak diberikan, defaultnya adalah None, sehingga metode ini tidak pernah memunculkan KeyError.
2. Masalah itu terpecahkan.
Jika tanpa
default value
, Anda harus menulis kode rumit untuk menangani pengecualian seperti itu.Sebagai solusi yang nyaman,
dict.get
memperkenalkan nilai default opsional menghindari kode di atas tanpa disadari.3. Kesimpulan
dict.get
memiliki opsi nilai default tambahan untuk menangani pengecualian jika kunci tidak ada dalam kamussumber
Satu perbedaan, yang bisa menjadi keuntungan, adalah bahwa jika kita mencari kunci yang tidak ada, kita akan mendapatkan Tidak ada, tidak seperti ketika kita menggunakan notasi tanda kurung, dalam hal ini kita akan mendapatkan kesalahan yang dilemparkan:
Hal terakhir yang keren tentang metode get, adalah bahwa ia menerima argumen opsional tambahan untuk nilai default, yaitu jika kita mencoba untuk mendapatkan nilai skor dari seorang siswa, tetapi siswa tidak memiliki kunci skor yang bisa kita dapatkan a 0 sebagai gantinya.
Jadi alih-alih melakukan ini (atau yang serupa):
Kita bisa melakukan ini:
sumber
Berdasarkan penggunaan harus menggunakan
get
metode ini .Contoh 1
Contoh2
sumber