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.