Saya perlu cara untuk mendapatkan nilai kamus jika kuncinya ada, atau cukup kembali None
, jika tidak.
Namun, Python memunculkan KeyError
pengecualian jika Anda mencari kunci yang tidak ada. Saya tahu bahwa saya dapat memeriksa kuncinya, tetapi saya mencari sesuatu yang lebih eksplisit. Apakah ada cara untuk kembali None
jika kuncinya tidak ada?
python
dictionary
key
nonetype
Spyros
sumber
sumber
.get(key)
sebagai gantinya[key]
Jawaban:
Kamu bisa menggunakan
dict.get()
yang akan kembali
None
jikakey is not in d
. Anda juga dapat memberikan nilai default berbeda yang akan dikembalikan alih-alihNone
:sumber
None
jika kunci secara eksplisit dipetakan keNone
dalam dict. Jika bukan itu yang Anda inginkan, Anda dapat menggunakan sesuatu sepertid.get(key) or "empty"
.[]
,""
,False
,0.0
atau memangNone
), maka solusinya Anda akan selalu kembali0
. Jika Anda mengharapkanNone
s sebagai nilai, Anda harus melakukanif key in d:
pemeriksaan secara eksplisit."empty"
dikembalikan jikakey
bukan kunci yang validd
. Ini tidak ada hubungannya dengan nilaikey
yang dipetakan.Bertanya-tanya lagi. Itu dibangun ke dalam bahasa.
sumber
Menggunakan
dict.get
Mengembalikan nilai kunci jika kunci ada di kamus, kalau tidak default. Jika default tidak diberikan, defaultnya adalah None, sehingga metode ini tidak pernah memunculkan KeyError.
sumber
Anda harus menggunakan
get()
metode daridict
kelasIni akan menghasilkan
r == None
. Jika kunci tidak ditemukan dalam kamus, fungsi get mengembalikan argumen kedua.sumber
None
secara eksplisit. Itu adalah default.Jika Anda menginginkan solusi yang lebih transparan, Anda bisa subkelas
dict
untuk mendapatkan perilaku ini:sumber
defaultdict
adalah bahwa ia akan tumbuh setiap kali elemen yang belum ada diminta. Ini tidak selalu diinginkan.foo['bar']['test']['sss']
untuk kembali,None
bukan pengecualian, Setelah satu kedalaman itu mulai memberikanTypeError
bukanKeyError
NoneDicts
. Ini akan membantu jika hal ituKeyError
akan terjadi pada objek yang paling dalam. Kalau tidak, masalahnya adalah bahwa sekali Anda mengembalikanNone
objek, Anda tidak dapat berlangganan lagi. Satu peretasan jelek akan mengembalikan objek lain yang menguji sukaNone
. Namun waspadalah bahwa ini dapat menyebabkan bug yang mengerikan.return dict.get(self, key)
kereturn super().get(key)
? Lalu jika saya memutuskan untuk menggunakan OrderedDict alih-alih dict, misalnya, saya tidak perlu khawatir mengubah beberapa baris kode.Saya biasanya menggunakan defaultdict untuk situasi seperti ini. Anda menyediakan metode pabrik yang tidak mengambil argumen dan menciptakan nilai ketika melihat kunci baru. Ini lebih berguna ketika Anda ingin mengembalikan sesuatu seperti daftar kosong pada kunci baru ( lihat contoh ).
sumber
defaultdict
adalah akan terus bertambah setiap kali elemen yang tidak ada diminta.Anda bisa menggunakan
dict
objekget()
metode, seperti orang lain telah disarankan. Atau, tergantung pada apa yang Anda lakukan, Anda mungkin dapat menggunakantry/except
suite seperti ini:Yang dianggap sebagai pendekatan yang sangat "Pythonic" untuk menangani kasus ini.
sumber
Solusi satu baris adalah:
Ini berguna ketika mencoba menambahkan nilai kamus ke daftar baru dan ingin memberikan default:
misalnya.
sumber
Seperti yang orang lain katakan di atas, Anda dapat menggunakan get ().
Tetapi untuk memeriksa kunci, Anda juga dapat melakukan:
sumber
get
metode ini.Saya terkejut dengan apa yang mungkin di python2 vs python3. Saya akan menjawabnya berdasarkan apa yang akhirnya saya lakukan untuk python3. Tujuan saya sederhana: memeriksa apakah respons json dalam format kamus memberikan kesalahan atau tidak. Kamus saya disebut "token" dan kunci saya yang saya cari adalah "kesalahan". Saya mencari kunci "kesalahan" dan jika tidak ada pengaturannya untuk nilai Tidak, maka memeriksa adalah nilai Tidak, jika demikian lanjutkan dengan kode saya. Pernyataan lain akan menangani jika saya memiliki kunci "kesalahan".
sumber
Jika Anda dapat melakukannya dengan
False
, maka, ada juga fungsi bawaan hasattr :sumber