Pertanyaan Periksa apakah kunci yang diberikan sudah ada dalam kamus


Saya ingin menguji apakah kunci ada 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 di kamus?


2178
2017-10-21 19:05


asal


Jawaban:


in adalah cara yang dimaksudkan untuk menguji keberadaan kunci dalam dict.

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

Jika Anda menginginkan default, Anda selalu dapat menggunakannya dict.get():

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

... dan jika Anda ingin selalu memastikan nilai default untuk kunci apa pun yang dapat Anda gunakan defaultdict dari collections modul, seperti:

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

... tetapi secara umum, in kata kunci adalah cara terbaik untuk melakukannya.


2232
2017-10-21 19:10



Anda tidak perlu memanggil kunci:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

Itu akan jauh lebih cepat karena menggunakan hashing kamus sebagai lawan melakukan pencarian linear, yang memanggil tombol akan dilakukan.


1093
2017-10-21 19:06



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

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

Penggunaan yang umum untuk memeriksa keberadaan kunci dalam kamus sebelum memutasikannya adalah dengan menginisialisasi default nilai (misalnya jika nilai-nilai Anda adalah daftar, misalnya, dan Anda ingin memastikan bahwa ada daftar kosong yang dapat Anda tambahkan saat memasukkan nilai pertama untuk kunci). Dalam kasus seperti itu, Anda mungkin menemukan collections.defaultdict() tipe yang menarik.

Dalam kode yang lebih lama, Anda mungkin juga menemukan beberapa penggunaan has_key(), metode yang ditinggalkan untuk memeriksa keberadaan kunci dalam kamus (hanya digunakan key_name in dict_name, sebagai gantinya).


226
2017-10-21 19:16



Anda dapat mempersingkat ini:

if 'key1' in dict:
    ...

Namun, ini paling baik adalah perbaikan kosmetik. Mengapa Anda percaya ini bukan cara terbaik?


74
2017-10-21 19:06



Saya akan merekomendasikan menggunakan setdefault metode sebaliknya. Kedengarannya seperti itu akan melakukan semua 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}

40
2017-10-21 19:07



Untuk info tambahan tentang eksekusi kecepatan dari metode usulan jawaban yang diterima (10 m loop):

  • 'key' in mydict waktu yang berlalu 1.07 detik
  • mydict.get('key') waktu yang berlalu 1,84 detik
  • mydefaultdict['key'] waktu yang berlalu 1.07 detik

Karena itu menggunakan in atau defaultdict dianjurkan melawan get.


35
2018-05-29 11:06



Kamus dalam python memiliki metode get ('kunci', default). Jadi Anda bisa menetapkan nilai default jika tidak ada kunci.

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

19
2018-03-01 09:03



Untuk pengecekan bisa Anda gunakan has_key() metode

if dict.has_key('key1'):
   print "it is there"

Jika Anda menginginkan suatu nilai maka Anda dapat menggunakan get() metode

a = dict.get('key1', expeced_type)

Jika Anda menginginkan tuple atau daftar atau kamus atau string apa pun sebagai nilai default sebagai nilai kembalian, kemudian gunakan get() metode

a = dict.get('key1', {}).get('key2', [])

15
2017-09-10 18:37



Menggunakan operator terner:

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

14
2017-08-18 22:58