Sözlükte bir değerin olup olmadığını kontrol etme (python)


251

Python'da aşağıdaki sözlük var:

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

Bu sözlükte "bir" veya "iki" gibi bir değer olup olmadığını bulmak için bir yol gerekir.

Örneğin, "1" indeksinin var olup olmadığını bilmek istersem sadece şunu yazmam gerekir:

"1" in d

Ve sonra python bunun doğru veya yanlış olduğunu söylerdi, ancak bir değer olup olmadığını bulmak dışında aynı şeyi yapmam gerekiyor.

Yanıtlar:


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

Meraktan, bazı karşılaştırmalı zamanlama:

>>> 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]

DÜZENLEME: Ve nedenini merak ediyorsanız ... nedeni, yukarıdakilerin her birinin arama işlemleri için uygun olan veya olmayan farklı bir nesne türü döndürmesidir:

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

EDIT2: Yorumlarda isteğe göre ...

>>> 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]

elimde python yok, testleri 'bir' yerine 'dört' ile tekrar çalıştırabilir misin?
soulcheck

2
her şeyden önce gerekli değildi, daha büyük dikte üzerinde çalışmadıkça. Sanırım value () içindeki ek yük, değer listesini kopyalayarak ve viewvalues ​​() öğesindeki görünümü canlı tutarak korunur.
soulcheck

Küçük boyutu göz önüne alındığında, dzamanlamalar etkili bir şekilde anlamsızdır. Python 3'te, dict.values()varsayılan olarak bir sözlük görünümüdür dict.itervalues()ve dict.viewvalues()gitti. Bunu (daha büyük bir sözlükle) yeniden test edebilir list(d.values())ve Python 2 davranışını iter(d.values())almak ve dict.itervalues()davranışı almak için kullanabilirsiniz , ancak her iki sürüm de global bir arama ve arama gerektirdiğinden, kesinlikle daha yavaş olacaktır. Her ikisi de gerekli olmayan ekstra işler yapar.
Martijn Pieters

33

Kullanabilirsiniz

"one" in d.itervalues()

"one"sözlüğünüzün değerleri arasında olup olmadığını test etmek için.


22

Python sözlüğü get (key) işlevine sahiptir

>>> d.get(key)

Örneğin,

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

Anahtarınız yoksa, nonedeğer döndürür .

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

3.0'dan küçük ve 5.0'dan büyük sürümlerle alakalı içerik. .


29
Soruya cevap vermiyor. OP key:valueanahtar olarak değil , bir değer sordu .
akshaynagpal

10

Sözlük görünümlerini kullan:

if x in d.viewvalues():
    dosomething()..

4

Değerleri kontrol etmek için farklı tipler mevcuttur

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

Ya değerler listesi

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

Dize değerlerine sahip değerlerin listesi

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

Kullanmayın value in [... list comprehension over sequence ...], kullanım any(value in sequence ...)değeri tespit edildiğinde her şeyden ve kısa devre için kullanmak olmayan bir liste nesnesi oluşturarak önlemek için.
Martijn Pieters

0

Python 3'te values()sözlüğün işlevini kullanabilirsiniz . Değerlerin bir görünüm nesnesini döndürür. Bu da iterbir yineleyici nesnesi döndüren işleve geçirilebilir . Yineleyici şu şekilde kontrol edilebilir in,

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

Ya da listeye benzer olduğu için görünüm nesnesini doğrudan kullanabilirsiniz

'one' in d.values()

1
Orada hiçbir nokta kullanarak iter()bir sözlük görünümü; innesneyi yinelenebilir olarak kullanacaktır (tür özel bir __contains__yöntem uygulamaz ). Arasındaki tek fark 'one' in iter(d.values())ve 'one in d.values()Python ekstra çalışma (için küresel arama maliyetini ödeyen yaptırdı olmasıdır iter).
Martijn Pieters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.