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.

Réponses:


277

Essayer:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}

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}

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}

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}]

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]

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}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.