Как проверить, существует ли значение в словаре (python)

251

У меня есть следующий словарь в Python:

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

Мне нужен способ узнать, существует ли в этом словаре значение типа «один» или «два».

Например, если бы я хотел узнать, существует ли индекс «1», мне просто нужно было бы набрать:

"1" in d

И тогда python скажет мне, является ли это истиной или ложью, однако мне нужно сделать то же самое, за исключением того, чтобы найти, существует ли значение.

JimmyK
источник

Ответы:

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]

РЕДАКТИРОВАТЬ: И в случае, если вам интересно, почему ... причина в том, что каждый из вышеперечисленных возвращает различные типы объектов, которые могут или не могут быть хорошо подходят для операций поиска:

>>> 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]
макинтош
источник
у меня нет Python под рукой, не могли бы вы повторить тесты с «четыре» вместо «один»?
проверка души
2
в конце концов, это не было необходимостью, если только не побуждать к большему Я предполагаю, что издержки в values ​​() вызваны копированием списка значений и viewvalues ​​(), поддерживая представление живым.
соулчек
Учитывая небольшой размер d, сроки фактически бессмысленны. В Python 3 dict.values()есть представление словаря, по умолчанию и dict.itervalues()и dict.viewvalues()ушли. Вы можете повторно протестировать это (с большим словарем) и использовать, list(d.values())чтобы получить поведение Python 2 и iter(d.values())получить dict.itervalues()поведение, но, поскольку обе эти версии требуют глобального поиска и вызова, они будут абсолютно медленными. Оба делают дополнительную работу, которая не нужна.
Мартин Питерс
33

Ты можешь использовать

"one" in d.itervalues()

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

Свен Марнах
источник
22

Словарь 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()..
soulcheck
источник
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 ...), чтобы избежать создания объекта списка, который вы не используете ни для чего другого, и для короткого замыкания, когда значение найдено.
Мартин Питерс
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).
Мартин Питерс