Eu criei uma função que irá procurar idades em um Dictionary
e mostrar o nome correspondente:
dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
for age in dictionary.values():
if age == search_age:
name = dictionary[age]
print name
Eu sei como comparar e encontrar a idade em que simplesmente não sei como mostrar o nome da pessoa. Além disso, estou recebendo uma KeyError
causa da linha 5. Sei que não está correta, mas não consigo descobrir como fazê-la pesquisar para trás.
python
dictionary
user998316
fonte
fonte
Respostas:
Não há nenhum.
dict
não se destina a ser usado dessa maneira.fonte
Python 3.x
list.items()
vez delist.iteritems()
deve ser usadodict
pode ser para várias coisas em momentos diferentes; chaves e valores têm um significado claro, é claro, mas "dict
itens com um determinado valor" é uma solicitação perfeitamente razoável. A recomendação de usar uma lista de pares iria descartar o contexto que um item é uma ' definição ' do outro, por exemplo, em listas de parâmetros ...Ou no Python 3.x:
Basicamente, ele separa os valores do dicionário em uma lista, localiza a posição do valor que você possui e obtém a chave nessa posição.
Mais sobre
keys()
e.values()
no Python 3: Como posso obter uma lista de valores do dict?fonte
list.keys()
elist.values()
geram itens na mesma ordem?index
método.Se você deseja o nome e a idade, deve usar o
.items()
que fornece as(key, value)
tuplas principais :Você pode descompactar a tupla em duas variáveis separadas diretamente no
for
loop e depois corresponder à idade.Você também deve reverter o dicionário se geralmente procura por idade e não há duas pessoas com a mesma idade:
para que você possa procurar o nome por uma idade, apenas fazendo
Chamo-o em
mydict
vez delist
porquelist
é o nome de um tipo interno e você não deve usar esse nome para mais nada.Você pode até obter uma lista de todas as pessoas com uma determinada idade em uma linha:
ou se houver apenas uma pessoa com cada idade:
o que lhe dará apenas
None
se não houver ninguém com essa idade.Finalmente, se o
dict
arquivo for longo e você estiver usando o Python 2, considere usar em.iteritems()
vez do.items()
Cat Plus Plus em sua resposta, pois não é necessário fazer uma cópia da lista.fonte
dict
por uma lista de pares.dict
faz sentido.value --> key
oukey --> value
Eu pensei que seria interessante apontar quais métodos são os mais rápidos e em que cenário:
Aqui estão alguns testes que eu executei (em um MacBook Pro de 2012)
Resultados de
profile.run()
cada método 100000 vezes:Método 1:
Método 2:
Método 3:
Portanto, isso mostra que, para um pequeno ditado, o método 1 é o mais rápido. Isso é mais provável porque ele retorna a primeira correspondência, em oposição a todas as correspondências como o método 2 (veja a nota abaixo).
Curiosamente, executando os mesmos testes em um ditado que tenho com 2700 entradas, obtenho resultados bem diferentes (desta vez, executados 10000 vezes):
Método 1:
Método 2:
Método 3:
Então, aqui, o método 3 é muito mais rápido. Apenas mostra que o tamanho do seu ditado afetará o método escolhido.
Notas: O método 2 retorna uma lista de todos os nomes, enquanto os métodos 1 e 3 retornam apenas a primeira correspondência. Eu não considerei o uso de memória. Não tenho certeza se o método 3 cria 2 listas extras (chaves () e valores ()) e as armazena na memória.
fonte
.keys()
e`,.values()
retorne as visualizações do dicionário, que são leves.versão de uma linha: (i é um dicionário antigo, p é um dicionário invertido)
explicação:
i.keys()
ei.values()
retorna duas listas com chaves e valores do dicionário, respectivamente. A função zip tem a capacidade de amarrar listas para produzir um dicionário.Aviso: Isso funcionará apenas se os valores forem laváveis e exclusivos.
fonte
ou melhor
fonte
fonte
lKey = [k for k, v in lDictionary.iteritems() if v == lValue][0] or 'else-key'
Tente esta lista para reverter um dicionário:
fonte
Achei esta resposta muito eficaz, mas não muito fácil de ler para mim.
Para tornar mais claro, você pode inverter a chave e o valor de um dicionário. Isso é fazer os valores das chaves e as chaves de valores, como visto aqui .
ou
que é essencialmente o mesmo que essa outra resposta .
fonte
Se você deseja encontrar a chave pelo valor, pode usar uma compreensão de dicionário para criar um dicionário de pesquisa e, em seguida, usá-lo para encontrar a chave no valor.
fonte
Você pode obter a chave usando
dict.keys()
,dict.values()
elist.index()
métodos, ver exemplos de código a seguir:fonte
search_age
var definido na próxima linha ... Talvez você deva substituirvalue
porsearch_age
?type(dict_values)
seria útil imprimir )?Aqui está a minha opinião sobre este problema. :) Acabei de começar a aprender Python, então chamo isso:
Solução "Compreensível para iniciantes".
.
.
fonte
fonte
is
deve ser usado apenas para testar a igualdade dos únicos (None
,True
,False
etc.). O fato de o CPython reutilizar literais de string (e, portanto,a = 'foobar'; a is 'foobar'
serTrue
) é um detalhe de implementação e não deve ser invocado.get_key
será lançadoStopIteration
se o valor não existir no dicionário - seria melhor usar onext(..., None)
que retornariaNone
se o valor não fosse encontrado.get_first_key = lambda v, d: next((k for k in d if (v in d[k] is not None)), None)
Considere usar Pandas. Conforme declarado em "Python for Data Analysis" de William McKinney
Para consultar sua série, faça o seguinte:
Qual produz:
Se você precisar fazer mais alguma coisa com a saída, transformar a resposta em uma lista pode ser útil:
fonte
Aqui, recover_key leva dicionário e valor para encontrar no dicionário. Em seguida, fazemos um loop sobre as chaves no dicionário e fazemos uma comparação com a do valor e retornamos essa chave específica.
fonte
podemos obter o
Key
dedict
:fonte
fonte
é respondido, mas pode ser feito com um uso sofisticado de 'mapear / reduzir';
fonte
O Cat Plus Plus mencionou que não é assim que um dicionário se destina a ser usado. Aqui está o porquê:
A definição de um dicionário é análoga à de um mapeamento em matemática. Nesse caso, um ditado é um mapeamento de K (o conjunto de chaves) para V (os valores) - mas não vice-versa. Se você derreferenciar um ditado, espera obter exatamente um valor retornado. Mas é perfeitamente legal que diferentes chaves sejam mapeadas para o mesmo valor, por exemplo:
Quando você pesquisa uma chave pelo seu valor correspondente, está basicamente invertendo o dicionário. Mas um mapeamento não é necessariamente invertível! Neste exemplo, pedir a chave correspondente a v1 pode gerar k1 ou k3. Você deve devolver os dois? Apenas o primeiro encontrado? É por isso que indexof () é indefinido para dicionários.
Se você conhece seus dados, você pode fazer isso. Mas uma API não pode assumir que um dicionário arbitrário é invertível, daí a falta de uma operação desse tipo.
fonte
aqui está a minha opinião. Isso é bom para exibir vários resultados, caso você precise de um. Então eu adicionei a lista também
E é isso...
fonte
A saída é a seguinte:
fonte
Não há uma maneira fácil de encontrar uma chave em uma lista 'pesquisando' o valor. No entanto, se você souber o valor, iterando pelas chaves, poderá procurar valores no dicionário pelo elemento. Se D [elemento] em que D é um objeto de dicionário, for igual à chave que você está tentando procurar, você poderá executar algum código.
fonte
Você precisa usar um dicionário e o inverso desse dicionário. Isso significa que você precisa de outra estrutura de dados. Se você estiver no python 3, use o
enum
módulo, mas se estiver usando o python 2.7, use aenum34
porta traseira do python 2.Exemplo:
fonte
fonte
Apenas minha resposta em
lambda
efilter
.fonte
já foi respondido, mas como várias pessoas mencionaram a reversão do dicionário, veja como você faz isso em uma linha (assumindo o mapeamento 1: 1) e alguns dados de perf:
python 2.6:
2.7+:
se você acha que não é 1: 1, ainda pode criar um mapeamento reverso razoável com algumas linhas:
quão lenta é essa: mais lenta que uma pesquisa simples, mas não tão lenta quanto você imagina - em um dicionário de entradas 100000 'direto', uma pesquisa 'rápida' (ou seja, procurando um valor que deve estar no início das teclas) foi cerca de 10x mais rápido do que reverter o dicionário inteiro e uma pesquisa "lenta" (no final) cerca de 4-5x mais rápido. Então, depois de no máximo 10 pesquisas, é pago por si próprio.
a segunda versão (com listas por item) leva cerca de 2,5x enquanto a versão simples.
Também teve alguns resultados interessantes com o ifilter. Teoricamente, se o filtro deve ser mais rápido, podemos usar itervalues () e possivelmente não precisamos criar / passar por toda a lista de valores. Na prática, os resultados foram ... estranhos ...
Portanto, para pequenas compensações, foi dramaticamente mais rápido que qualquer versão anterior (2,36 * u * S vs. um mínimo de 1,48 * m * S para casos anteriores). No entanto, para grandes compensações perto do final da lista, foi drasticamente mais lenta (15,1ms vs. o mesmo 1,48mS). As pequenas economias na parte baixa não valem o custo na parte alta, imho.
fonte
[
disso, se estiver. caso contrário, verifique se está em duas linhas ou coloque um;
entre elas, se não estiver.Às vezes, int () pode ser necessário:
fonte
Aqui está uma solução que funciona tanto em Python 2 quanto em Python 3:
A parte até
[search_age]
constrói o dicionário reverso (onde os valores são chaves e vice-versa). Você pode criar um método auxiliar que armazene em cache esse dicionário invertido da seguinte maneira:ou ainda mais geralmente uma fábrica que criaria um método de busca por nome por idade para uma ou mais listas
então você seria capaz de fazer:
Observe que eu renomei
list
para,ages_by_name
pois o primeiro é um tipo predefinido.fonte
É assim que você acessa o dicionário para fazer o que deseja:
é claro, seus nomes estão tão errados que parece que eles estão imprimindo uma era, mas NÃO imprime o nome. Como você está acessando pelo nome, fica mais compreensível se você escrever:
Melhor ainda:
fonte
Para várias ocorrências, use:
fonte
*** NameError: global name 'dictionary' is not defined
filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age , dictionary )