Memeriksa apakah suatu kunci tertentu yang sudah ada dalam kamus

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?

Mengomentari pertanyaan (5)
Larutan

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.

Komentar (6)

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.

Komentar (13)

Anda dapat menguji keberadaan kunci dalam kamus, menggunakan di kata kunci:


d = {'a': 1, 'b': 2}
'a' in d # 
Komentar (3)

Anda dapat mempersingkat ini:

if 'key1' in dict:
    ...

Namun, ini adalah yang terbaik, kosmetik perbaikan. Mengapa anda percaya ini bukan cara terbaik?

Komentar (4)

Untuk info tambahan pada kecepatan eksekusi dari jawaban yang diterima's metode yang diusulkan (10m loop):

  • 'kunci' di mydict waktu berlalu 1.07 sec
  • mydict.mendapatkan('kunci') waktu berlalu 1.84 sec
  • mydefaultdict['kunci'] waktu berlalu 1.07 sec

Oleh karena itu menggunakan in atau defaultdict yang direkomendasikan terhadap get.

Komentar (2)

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}
Komentar (6)

Kamus di python telah mendapatkan('kunci', default) metode. Sehingga anda hanya dapat mengatur nilai default dalam hal ini tidak ada kunci.

values = {...}
myValue = values.get('Key', None)
Komentar (0)

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

Komentar (1)

Menggunakan operator ternary:

message = "blah" if 'key1' in dict else "booh"
print(message)
Komentar (0)

Cara-cara di mana anda bisa mendapatkan hasil:

  • jika your_dict.has_key(kunci) Dihapus di Python 3
  • jika tombol di your_dict
  • cobalah/kecuali blok

Mana yang lebih baik tergantung pada 3 hal:

  1. Apakah kamus 'biasanya memiliki tombol' atau 'biasanya tidak memiliki kunci'.
  2. Apakah anda berniat untuk menggunakan kondisi seperti if...else...elseif...else?
  3. Seberapa besar adalah kamus?

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."
Komentar (1)

Python 2 saja: (dan python 2.7 mendukung `dalam` sudah)

anda dapat menggunakan has_key() metode:

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass
Komentar (2)

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.

Komentar (1)

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().

Komentar (1)

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.
Komentar (3)

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 &#39;Beberapa string&#39; 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 "", line 1, in 
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 &#39;boo&#39;

>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>> 
Komentar (0)

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')
Komentar (2)