Cara memeriksa apakah ada nilai dalam kamus (python)

251

Saya memiliki kamus berikut di python:

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

Saya perlu cara untuk mengetahui apakah ada nilai seperti "satu" atau "dua" dalam kamus ini.

Misalnya, jika saya ingin tahu apakah indeks "1" ada, saya cukup mengetik:

"1" in d

Dan kemudian python akan memberi tahu saya apakah itu benar atau salah, namun saya perlu melakukan hal yang persis sama kecuali untuk menemukan apakah ada nilai.

JimmyK
sumber

Jawaban:

381
>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True

Karena penasaran, beberapa waktu perbandingan:

>>> T(lambda : 'one' in d.itervalues()).repeat()
[0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
>>> T(lambda : 'one' in d.values()).repeat()
[0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
>>> T(lambda : 'one' in d.viewvalues()).repeat()
[0.32004380226135254, 0.31716084480285645, 0.3171098232269287]

EDIT: Dan jika Anda bertanya-tanya mengapa ... alasannya adalah bahwa masing-masing di atas mengembalikan jenis objek yang berbeda, yang mungkin atau mungkin tidak cocok untuk operasi pencarian:

>>> type(d.viewvalues())
<type 'dict_values'>
>>> type(d.values())
<type 'list'>
>>> type(d.itervalues())
<type 'dictionary-valueiterator'>

EDIT2: Sesuai permintaan dalam komentar ...

>>> T(lambda : 'four' in d.itervalues()).repeat()
[0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
>>> T(lambda : 'four' in d.values()).repeat()
[0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
>>> T(lambda : 'four' in d.viewvalues()).repeat()
[0.43414998054504395, 0.4213531017303467, 0.41684913635253906]
Mac
sumber
saya tidak punya python di tangan, dapatkah Anda menjalankan kembali tes dengan 'empat' bukan 'satu'?
soulcheck
2
lagipula itu bukan keharusan, kecuali berjalan dict yang lebih besar. Saya kira overhead dalam nilai () disebabkan oleh menyalin daftar nilai dan dalam nilai tampilan () dengan mempertahankan tampilan hidup.
soulcheck
Mengingat ukurannya yang kecil d, penentuan waktu secara efektif tidak berarti. Dalam Python 3, dict.values()adalah tampilan kamus, secara default, dan dict.itervalues()dan dict.viewvalues()hilang. Anda bisa menguji ulang ini (dengan kamus yang lebih besar) dan menggunakannya list(d.values())untuk mendapatkan perilaku Python 2, dan iter(d.values())untuk mendapatkan dict.itervalues()perilaku tersebut, tetapi karena kedua versi tersebut memerlukan pencarian dan panggilan global, keduanya akan lebih lambat. Keduanya melakukan pekerjaan ekstra yang tidak diperlukan.
Martijn Pieters
33

Kamu bisa memakai

"one" in d.itervalues()

untuk menguji apakah "one"ada di antara nilai-nilai kamus Anda.

Sven Marnach
sumber
22

Kamus python memiliki fungsi (kunci)

>>> d.get(key)

Sebagai contoh,

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
none

Jika kunci Anda tidak ada, akan mengembalikan nonenilai.

foo = d[key] # raise error if key doesn't exist
foo = d.get(key) # return none if key doesn't exist

Konten yang relevan dengan versi kurang dari 3.0 dan lebih besar dari 5.0. .

Shameem
sumber
29
Tidak menjawab pertanyaan. OP bertanya tentang suatu nilai seperti dalam key:valuedan bukan kunci.
akshaynagpal
10

Gunakan tampilan kamus:

if x in d.viewvalues():
    dosomething()..
cek jiwa
sumber
4

Jenis yang berbeda untuk memeriksa nilai ada

d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False

Bagaimana jika daftar nilai

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True

Bagaimana jika daftar nilai dengan nilai string

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True
sim
sumber
Jangan gunakan value in [... list comprehension over sequence ...], gunakan any(value in sequence ...), untuk menghindari membuat objek daftar yang tidak Anda gunakan untuk hal lain, dan melakukan hubungan arus pendek ketika nilai telah ditemukan.
Martijn Pieters
0

Dalam Python 3 Anda dapat menggunakan values()fungsi kamus. Ini mengembalikan objek tampilan nilai-nilai. Ini, pada gilirannya, dapat diteruskan ke iterfungsi yang mengembalikan objek iterator. Iterator dapat diperiksa menggunakan in, seperti ini,

'one' in iter(d.values())

Atau Anda dapat menggunakan objek tampilan secara langsung karena mirip dengan daftar

'one' in d.values()
Reed Richards
sumber
1
Tidak ada gunanya menggunakan iter()pada tampilan kamus; insudah akan menggunakan objek sebagai iterable (tipe tidak mengimplementasikan __contains__metode khusus ). Satu-satunya perbedaan antara 'one' in iter(d.values())dan 'one in d.values()adalah bahwa Anda membuat Python melakukan pekerjaan ekstra (membayar biaya pencarian global iter).
Martijn Pieters