Recebo um dicionário como entrada e gostaria de retornar um dicionário cujas chaves serão os valores de entrada e cujo valor serão as chaves de entrada correspondentes. Os valores são únicos.
Por exemplo, digamos que minha entrada seja:
a = dict()
a['one']=1
a['two']=2
Eu gostaria que minha saída fosse:
{1: 'one', 2: 'two'}
Para esclarecer, gostaria que meu resultado fosse o equivalente ao seguinte:
res = dict()
res[1] = 'one'
res[2] = 'two'
Alguma maneira Pythônica legal de conseguir isso?
python
dictionary
Roee Adler
fonte
fonte
Respostas:
Python 2:
Python 3 (graças a @erik):
fonte
[
e]
. a compreensão de uma lista não requer o[
e]
?fonte
A partir do Python 2.7, incluindo 3.0+, há uma versão indiscutivelmente mais curta e legível:
fonte
fonte
Você pode fazer uso de compreensões de dicionário :
Editado: Para Python 3, use em
a.items()
vez dea.iteritems()
. As discussões sobre as diferenças entre eles podem ser encontradas em iteritens em Python no SO.fonte
Você poderia tentar:
Esteja ciente de que você não pode 'inverter' um dicionário se
{'one':1,'two':1}
. O novo dicionário só pode ter um item com chave1
.{'one':[1]}
.[1]
é um valor válido, mas não uma chave válida.Veja este tópico na lista de discussão do python para uma discussão sobre o assunto.
fonte
res = dict(zip(a.values(), a.keys()))
fonte
A resposta principal atual assume que os valores são únicos, o que nem sempre é o caso. E se os valores não forem únicos? Você perderá informações! Por exemplo:
retorna
{2: 'b', 3: 'a'}
.A informação sobre
'c'
foi completamente ignorada. Idealmente, deveria ser algo assim{2: ['b','c'], 3: ['a']}
. Isso é o que a implementação inferior faz.Python 2.x
Python 3.x
fonte
ou ainda melhor, mas só funciona no Python 3:
fonte
Outra maneira de expandir a resposta de Ilya Prokin é realmente usar a
reversed
função.Em essência, seu dicionário é iterado (usando
.items()
) onde cada item é um par chave / valor e esses itens são trocados com areversed
função. Quando isso é passado para odict
construtor, ele os transforma em pares de valor / chave que é o que você deseja.fonte
Sugestão de melhoria para a resposta de Javier:
Em vez de
d.keys()
escrever apenasd
, porque se você percorrer o dicionário com um iterador, ele retornará as chaves do dicionário relevante.Ex. para este comportamento:
fonte
Pode ser feito facilmente com a compreensão do dicionário:
fonte
.items()
retorna uma lista de tuplas de(key, value)
.map()
passa por elementos da lista e aplicalambda x:[::-1]
a cada um de seus elementos (tupla) para revertê-la, de modo que cada tupla se torna(value, key)
na nova lista cuspida fora do mapa. Por fim,dict()
faz um ditado da nova lista.fonte
lambda x:[::-1]
a cada um de seus elementos (tupla) para revertê-la, de modo que cada tupla se torna (valor, chave) na nova lista expulsa do mapa. Finalmente, dict () cria um dict da nova lista.Usando loop : -
fonte
Se você estiver usando Python3, é um pouco diferente:
fonte
Adicionando uma solução no local:
No Python3, é fundamental que você use
list(d.keys())
porquedict.keys
retorna uma visão das chaves. Se você estiver usando Python2,d.keys()
é o suficiente.fonte
A resposta de Hanan é a correta, pois cobre um caso mais geral (as outras respostas são meio enganosas para alguém que não tem conhecimento da situação duplicada). Uma melhoria na resposta de Hanan é usar setdefault:
fonte