tuple python à dict

149

Pour le tuple, t = ((1, 'a'),(2, 'b')) dict(t)retourne{1: 'a', 2: 'b'}

Existe-t-il un bon moyen d'obtenir {'a': 1, 'b': 2}(les clés et les vals échangés)?

En fin de compte, je veux être en mesure de revenir 1donné 'a'ou 2donné 'b', peut-être que la conversion en dict n'est pas la meilleure façon.

Jake
la source

Réponses:

277

Essayer:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}
Greg Hewgill
la source
8
+1 Beautiful !, j'ai dû l'essayer avec zip dict(zip(*zip(*t)[::-1])). C'est plus lent, plus laid et utilise beaucoup plus de mémoire ... probablement 3x.
kevpie
@kevpie La chose merveilleuse à propos de Python est qu'il existe une centaine de façons d'exprimer comment faire quelque chose, toutes aussi intéressantes les unes que les autres.
bjd2385
Génial, si ce que vous avez est un triple, vous pouvez le faire: dict((x, y) for x, y, z in t)ou dict((x, (y, z)) for x, y, z in t)obtenir les deuxième et troisième valeurs sous forme de tuple.
guival
Très rapide, complet et simple. Réponse parfaite.
gies0r
73

Une méthode un peu plus simple:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}
jterrace
la source
1
qu'est-ce qui rend cela plus rapide?
maazza
9
Les fonctions map et dict sont implémentées en C et sont beaucoup plus rapides que n'importe quelle version de python
jterrace
1
J'aime cela pour avoir reverseexplicitement précisé.
Frerich Raabe
4
@maazza: en général, les tests de performances suggèrent que (au moins dans l'implémentation C) mapest plus rapide qu'une compréhension lorsque l'objet mappé est une autre fonction intégrée (comme reversed); dans la plupart des autres cas, le contraire est vrai. Mais il vaut mieux profiler que deviner :)
Karl Knechtel
43

Encore plus concis si vous êtes sur python 2.7:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}
autholykos
la source
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
la source
Je ne vois pas comment cette réponse à la question de OP
Luca Amerio
4

S'il existe plusieurs valeurs pour la même clé, le code suivant ajoutera ces valeurs à une liste correspondant à leur clé,

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

Voici quelques façons de le faire:

>>> 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
la source