Як перевірити, чи існує значення в словнику (python)


251

У python у мене є такий словник:

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

Мені потрібен спосіб виявити, чи є в цьому словнику таке значення, як "один" або "два".

Наприклад, якби я хотів знати, чи існує індекс "1", я просто повинен був би набрати:

"1" in d

І тоді python сказав би мені, чи це правда чи неправда, проте мені потрібно зробити те саме, окрім того, щоб знайти, чи існує значення.

Відповіді:


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

З цікавості, деякі порівняльні терміни:

>>> 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: І якщо вам цікаво, чому ... причина полягає в тому, що кожен із перерахованих вище повертає різний тип об'єкта, який може бути або не дуже підходить для операцій пошуку:

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

EDIT2: Відповідно до запиту в коментарях ...

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

У мене немає пітона під рукою, чи не могли б ви повторити тести на "чотири" замість "один"?
соучек

2
Зрештою, це не було необхідним, якщо тільки не працювати на більшій вигадці. Я думаю, що накладні витрати у значеннях () спричинені копією списку значень та переглядами () шляхом підтримання перегляду живим.
соулчек

Враховуючи невеликий розмір d, терміни фактично безглузді. У Python 3 dict.values()- це перегляд словника за замовчуванням, dict.itervalues()і dict.viewvalues()вони вже не залишилися. Ви можете повторно протестувати це (за допомогою більшого словника) і використовувати list(d.values())для отримання поведінки Python 2 та iter(d.values())отримання dict.itervalues()поведінки, але оскільки обидві ці версії вимагають глобального пошуку та виклику, вони будуть абсолютно повільнішими. Обоє виконують додаткову роботу, яка не потрібна.
Martijn Pieters

33

Можна використовувати

"one" in d.itervalues()

перевірити, чи "one"є серед значень вашого словника.


23

У словнику Python є функція get (key)

>>> d.get(key)

Наприклад,

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

Якщо ваш ключ не існує, поверне noneзначення.

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

Вміст, що стосується версій менше 3,0 і більше 5,0. .


29
Не відповідає на запитання. ОП запитав про значення як у, key:valueа не ключове.
акшайгнапал

10

Використовувати перегляди словника:

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

4

Існують різні типи перевірки значень

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

Що робити, якщо список значень

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

Що робити, якщо список значень зі строковими значеннями

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

Не використовуйте value in [... list comprehension over sequence ...], не використовуйте any(value in sequence ...), щоб уникнути створення об'єкта списку, який ви не використовуєте ні для чого іншого, а також для короткого замикання, коли значення знайдено.
Martijn Pieters

0

У Python 3 ви можете використовувати values()функцію словника. Він повертає об'єкт перегляду значень. Це, у свою чергу, може бути передано iterфункції, яка повертає об'єкт ітератора. Ітератор можна перевірити, використовуючи in, наприклад,

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

Або ви можете використовувати об'єкт перегляду безпосередньо, оскільки він подібний до списку

'one' in d.values()

1
Немає сенсу використовувати iter()у поданні словник; inвже використовуватиме об’єкт як ітерабельний (тип не реалізує виділений __contains__метод). Єдина різниця між 'one' in iter(d.values())і 'one in d.values()полягає в тому, що ви змусили Python робити додаткову роботу (оплачуючи вартість глобального пошуку iter).
Martijn Pieters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.