Saya ingin menguji apakah ada kunci dalam kamus sebelum memperbarui nilai untuk kunci. Saya menulis kode berikut:
if 'key1' in dict.keys():
print "blah"
else:
print "boo"
Saya pikir ini bukan cara terbaik untuk menyelesaikan tugas ini. Apakah ada cara yang lebih baik untuk menguji kunci dalam kamus?
dalam
adalah cara yang dimaksudkan untuk menguji keberadaan kunci dalam dict
.
d = dict()
for i in range(100):
key = i % 10
if key in d:
d[key] += 1
else:
d[key] = 1
Jika anda ingin default, anda dapat selalu menggunakan dict.get()
:
d = dict()
for i in range(100):
key = i % 10
d[key] = d.get(key, 0) + 1
... dan jika anda ingin selalu memastikan nilai default untuk setiap tombol anda dapat menggunakan defaultdict
dari koleksi
modul, seperti:
from collections import defaultdict
d = defaultdict(int)
for i in range(100):
d[i % 10] += 1
... tapi secara umum, dalam
kata kunci adalah cara terbaik untuk melakukannya.
Anda don't harus menelepon kunci:
if 'key1' in dict:
print "blah"
else:
print "boo"
Itu akan lebih cepat karena menggunakan kamus's hashing sebagai lawan untuk melakukan pencarian linear, yang menyebut kunci yang akan dilakukan.
Anda dapat menguji keberadaan kunci dalam kamus, menggunakan di kata kunci:
d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False
Yang umum digunakan untuk memeriksa keberadaan kunci dalam kamus sebelum bermutasi itu adalah untuk default-menginisialisasi nilai (misalnya, jika nilai-nilai anda yang daftar, misalnya, dan anda ingin memastikan bahwa ada daftar kosong yang dapat anda tambahkan ketika memasukkan nilai pertama untuk kunci). Dalam kasus-kasus seperti itu, anda mungkin menemukan collections.defaultdict()
jenis menjadi menarik.
Di tua kode, anda juga dapat menemukan beberapa kegunaan dari has_key()
, yang usang metode untuk memeriksa keberadaan kunci dalam kamus-kamus (hanya menggunakan key_name di dict_name
, sebagai gantinya).
Untuk info tambahan pada kecepatan eksekusi dari jawaban yang diterima's metode yang diusulkan (10m loop):
'kunci' di mydict
waktu berlalu 1.07 secmydict.mendapatkan('kunci')
waktu berlalu 1.84 secmydefaultdict['kunci']
waktu berlalu 1.07 secOleh karena itu menggunakan in
atau defaultdict
yang direkomendasikan terhadap get
.
Saya akan merekomendasikan menggunakan setdefault
metode sebaliknya. Kedengarannya seperti itu akan melakukan segala sesuatu yang anda inginkan.
>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}
Bagaimana menggunakan EAFP (lebih mudah untuk meminta pengampunan dari izin):
try:
blah = dict["mykey"]
# key exists in dict
except KeyError:
# key doesn't exist in dict
Lihat yang lain JADI posting:
https://stackoverflow.com/questions/1835756/using-try-vs-if-in-python atau
https://stackoverflow.com/questions/204308/checking-for-member-existence-in-python
Cara-cara di mana anda bisa mendapatkan hasil:
Mana yang lebih baik tergantung pada 3 hal:
Baca Lebih lanjut: http://paltman.com/try-except-performance-in-python-a-simple-test/
Penggunaan mencoba/blok bukan 'di' atau 'jika':
try:
my_dict_of_items[key_i_want_to_check]
except KeyError:
# Do the operation you wanted to do for "key not present in dict".
else:
# Do the operation you wanted to do with "key present in dict."
anda dapat menggunakan has_key() metode:
if dict.has_key('xyz')==1:
#update the value for the key
else:
pass
Just FYI menambahkan untuk Chris. B (jawaban terbaik):
d = defaultdict(int)
Bekerja dengan baik; alasannya adalah bahwa panggilan int()
mengembalikan 0
yang adalah apa yang defaultdict
apakah di balik layar (ketika membangun sebuah kamus), oleh karena itu nama "Fungsi Pabrik" dalam dokumentasi.
Memeriksa apakah suatu kunci tertentu yang sudah ada dalam kamus
Untuk mendapatkan ide bagaimana untuk melakukan itu kita terlebih dahulu memeriksa metode apa yang dapat kita sebut di kamus. Berikut ini adalah metode-metode:
d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
Python Dictionary clear() Removes all Items
Python Dictionary copy() Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys() Creates dictionary from given sequence
Python Dictionary get() Returns Value of The Key
Python Dictionary items() Returns view of dictionary (key, value) pair
Python Dictionary keys() Returns View Object of All Keys
Python Dictionary pop() Removes and returns element having given key
Python Dictionary popitem() Returns & Removes Element From Dictionary
Python Dictionary setdefault() Inserts Key With a Value if Key is not Present
Python Dictionary update() Updates the Dictionary
Python Dictionary values() Returns view of all values in dictionary
Brutal metode untuk memeriksa apakah kunci yang sudah ada dapat menjadi get()
metode:
d.get("key")
Dua lainnya menarik metode item()
dan tombol()
terdengar seperti terlalu banyak bekerja. Jadi let's memeriksa jika get()
adalah metode yang tepat untuk kita. Kami memiliki dict d
:
d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
Pencetakan menunjukkan kunci kita don't memiliki akan kembali None
:
print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1
Kita <menyerang>mungkin</strike> menggunakannya untuk mendapatkan info jika kunci tidak hadir atau tidak.
Tapi pertimbangkan ini jika kita membuat sebuah dict dengan single kunci:None
:
d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None
Terkemuka yang get()
metode ini tidak dapat diandalkan dalam beberapa kasus, nilai-nilai dapat menjadi Tidak ada
.
Cerita ini harus berakhir bahagia. Jika kita menggunakan di
pembanding:
print('key' in d) #True
print('key2' in d) #False
Kami mendapatkan hasil yang benar. Kita dapat memeriksa Python byte code:
import dis
dis.dis("'key' in d")
# 1 0 LOAD_CONST 0 ('key')
# 2 LOAD_NAME 0 (d)
# 4 COMPARE_OP 6 (in)
# 6 RETURN_VALUE
dis.dis("d.get('key2')")
# 1 0 LOAD_NAME 0 (d)
# 2 LOAD_METHOD 1 (get)
# 4 LOAD_CONST 0 ('key2')
# 6 CALL_METHOD 1
# 8 RETURN_VALUE
Hal ini menunjukkan bahwa dalam
membandingkan operator tidak hanya lebih dapat diandalkan, tetapi bahkan lebih cepat dari get()
.
Python dictionary memiliki metode yang disebut __memuat__
. Metode ini akan mengembalikan True jika kamus yang memiliki kunci yang lain returns False.
>>> temp = {}
>>> help(temp.__contains__)
Help on built-in function __contains__:
__contains__(key, /) method of builtins.dict instance
True if D has a key k, else False.
Berbagi satu cara untuk memeriksa jika ada kunci menggunakan operator boolean.
d = {'a': 1, 'b':2}
keys = 'abcd'
for k in keys:
x = (k in d and 'blah') or 'boo'
print(x)
Ini kembali
>>> blah
>>> blah
>>> boo
>>> boo
Penjelasan
Pertama, anda harus tahu bahwa dalam Python, 0
, None
, atau benda-benda dengan panjang nol mengevaluasi untuk Palsu
. Segala sesuatu yang lain untuk mengevaluasi Benar
. Operasi Boolean dievaluasi dari kiri ke kanan dan kembali operan yang tidak Benar atau Palsu.
Let's melihat contoh:
>>> 'Some string' or 1/0
'Some string'
>>>
Sejak 'Beberapa string'
mengevaluasi Benar
, sisa atau
tidak dievaluasi dan tidak ada pembagian dengan nol kesalahan dinaikkan.
Tapi jika kita beralih pesanan 1/0
dievaluasi terlebih dahulu dan menimbulkan pengecualian:
>>> 1/0 or 'Some string'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>
Kita dapat menggunakan ini untuk pola untuk memeriksa jika ada kunci.
(k in d and 'blah')
tidak sama seperti
if k in d:
'blah'
else:
False
Ini sudah kembali hasil yang benar jika ada kunci, tapi kami ingin mencetak 'boo' ketika itu doesn't. Jadi, kami mengambil hasilnya dan atau
dengan 'boo'
>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>>
Anda dapat menggunakan untuk
loop untuk iterate atas kamus dan mendapatkan nama kunci yang ingin anda cari dalam kamus, setelah itu periksa apakah ada atau tidak menggunakan jika
kondisi:
dic = {'first' : 12, 'second' : 123}
for each in dic:
if each == 'second':
print('the key exists and the corresponding value can be updated in the dictionary')