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.