tupla python para ditar

149

Para a tupla, t = ((1, 'a'),(2, 'b')) dict(t)retorna{1: 'a', 2: 'b'}

Existe uma boa maneira de obter {'a': 1, 'b': 2}(chaves e vals trocados)?

Em última análise, quero poder retornar um 1dado 'a'ou um 2dado 'b', talvez converter para um ditado não seja o melhor caminho.

Jake
fonte

Respostas:

277

Experimentar:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}
Greg Hewgill
fonte
8
+1 Lindo !, tive que experimentar com zip dict(zip(*zip(*t)[::-1])). Isso é mais lento, mais feio e usa muito mais memória ... provavelmente 3x.
Kevpie
@kevpie A coisa maravilhosa sobre Python é que existem centenas de maneiras de expressar como fazer algo, cada uma tão interessante quanto a próxima.
precisa saber é
Ótimo, se você tem um triplo, pode fazer: dict((x, y) for x, y, z in t)ou dict((x, (y, z)) for x, y, z in t)obter o segundo e o terceiro valores como uma tupla.
guival 28/03
Muito rápido, abrangente e simples. Resposta perfeita.
gies0r
73

Um método um pouco mais simples:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}
jterrace
fonte
1
o que torna isso mais rápido?
maazza
9
As funções map e dict são implementadas em C e são muito mais rápidas que em qualquer versão python
jterrace
1
Eu gosto disso por ter reverseexplicitamente explicitado.
Frerich Raabe
4
@maazza: em geral, os testes de desempenho sugerem que (pelo menos na implementação C) mapé mais rápido que a compreensão quando a coisa que está sendo mapeada é outra função interna (como reversed); na maioria dos outros casos, o oposto é verdadeiro. Mas é melhor ao perfil de palpite :)
Karl Knechtel
43

Ainda mais conciso se você estiver no python 2.7:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}
autholykos
fonte
9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

Ou:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]
Gunnarsson
fonte
Não vejo como esta resposta à pergunta do OP
Luca Amerio
4

Se houver vários valores para a mesma chave, o código a seguir anexará esses valores a uma lista correspondente à sua chave,

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]
psun
fonte
2

Aqui estão algumas maneiras de fazer isso:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
Vlad Bezden
fonte