Как проверить, существует ли значение в словаре (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]

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

>>> 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()..

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).
— Мартин Питерс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.