Como verificar se existe um valor em um dicionário (python)

251

Eu tenho o seguinte dicionário em python:

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

Eu preciso de uma maneira de descobrir se existe um valor como "um" ou "dois" neste dicionário.

Por exemplo, se eu quisesse saber se o índice "1" existia, seria necessário digitar:

"1" in d

E então o python me diria se isso é verdadeiro ou falso, no entanto, preciso fazer exatamente a mesma coisa, exceto para descobrir se existe um valor.

JimmyK
fonte

Respostas:

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

Por curiosidade, algum momento comparativo:

>>> 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: E no caso de você se perguntar por que ... o motivo é que cada uma das opções acima retorna um tipo diferente de objeto, que pode ou não ser adequado para operações de pesquisa:

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

EDIT2: Conforme solicitação nos comentários ...

>>> 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]
Mac
fonte
Eu não tenho python na mão, você poderia executar novamente os testes com 'four' em vez de 'one'?
soulcheck
2
afinal, não era necessário, a menos que funcionasse com um ditado maior. Eu acho que a sobrecarga em values ​​() é causada pela cópia da lista de valores e em viewvalues ​​(), mantendo a visualização ativa.
21711 soulcheck
Dado o tamanho pequeno de d, os tempos são efetivamente sem sentido. Em Python 3, dict.values()é uma vista de dicionário, por padrão, e dict.itervalues()e dict.viewvalues()sumiram. Você pode testar novamente isso (com um dicionário maior) e usá list(d.values())-lo para obter o comportamento do Python 2 e iter(d.values())para obter o dict.itervalues()comportamento, mas como as duas versões exigem uma pesquisa e chamada globais, elas serão absolutamente mais lentas. Ambos fazem um trabalho extra que não é necessário.
Martijn Pieters
33

Você pode usar

"one" in d.itervalues()

para testar se "one"está entre os valores do seu dicionário.

Sven Marnach
fonte
22

Dicionário Python tem get (key) funcion

>>> d.get(key)

Por exemplo,

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

Se sua chave não existir, retornará nonevalor.

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

Conteúdo relevante para versões menores que 3.0 e maiores que 5.0. .

Shameem
fonte
29
Não responde a pergunta. O OP perguntou sobre um valor como in key:valuee não key.
Akshaynagpal
10

Use as visualizações do dicionário:

if x in d.viewvalues():
    dosomething()..
verificação da alma
fonte
4

Existem tipos diferentes para verificar os valores

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

E se a lista de valores

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

E se a lista de valores com valores de sequência

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
sim
fonte
Não use value in [... list comprehension over sequence ...], use any(value in sequence ...), para evitar a criação de um objeto de lista que você não usa para mais nada e para causar um curto-circuito quando o valor for encontrado.
Martijn Pieters
0

No Python 3, você pode usar a values()função do dicionário. Retorna um objeto de exibição dos valores. Por sua vez, isso pode ser passado para a iterfunção que retorna um objeto iterador. O iterador pode ser verificado usando in, assim,

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

Ou você pode usar o objeto de exibição diretamente, pois é semelhante a uma lista

'one' in d.values()
Reed Richards
fonte
1
Não faz sentido usar iter()em uma exibição de dicionário; injá usará o objeto como iterável (o tipo não implementa um __contains__método dedicado ). A única diferença entre 'one' in iter(d.values())e 'one in d.values()é que você fez o Python fazer um trabalho extra (pagando o custo de uma pesquisa global iter).
Martijn Pieters