2010-09-24 5 views
98

Pour tuple, t = ((1, 'a'),(2, 'b')) dict(t) retours {1: 'a', 2: 'b'}tuple python à dict

est-il un bon moyen d'obtenir {'a': 1, 'b': 2} (clés et vals permutés)? Je veux être capable de retourner 1 donné 'a' ou 2 donné 'b', peut-être convertir en dict n'est pas la meilleure façon.

Répondre

183

Essayez:

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

+1 Belle !, je l'avais essayer avec zip 'dict (zip (* zip (* t) [ :: - 1])) '. C'est plus lent, plus laid et en utilisant beaucoup plus de mémoire .. probablement 3x. – kevpie

+1

+1 Super !!! C'est exactement ce dont j'ai besoin! :) –

+0

@kevpie La chose merveilleuse à propos de Python est qu'il y a une centaine de façons d'exprimer comment faire quelque chose, chacune aussi intéressante que la suivante. – bjd2385

52

Une méthode un peu plus simple:

>>> t = ((1, 'a'),(2, 'b')) 
>>> dict(map(reversed, t)) 
{'a': 1, 'b': 2} 
+0

ce qui rend cela plus rapide? – maazza

+2

Les fonctions map et dict sont implémentées en C et sont beaucoup plus rapides que n'importe quelle version python. – jterrace

+0

Cela me plaît d'avoir explicitement '' reverse ''. –

5
>>> dict([('hi','goodbye')]) 
{'hi': 'goodbye'} 

Or: 

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

Encore plus concise si vous êtes sur Python 2.7:

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

Si plusieurs valeurs pour la même clé, le code suivant ajoutera thos Les valeurs de e à 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

Pourquoi le rendre difficile? vous pouvez simplement dire:

t = ((1, 'a'),(2, 'b')) 
tdic = dict(t) 
+0

Ceci est une mauvaise réponse à la question 'Existe-t-il un bon moyen d'obtenir {' a ': 1,' b ': 2} (touches et vals permutées)?'. Dans votre réponse, vous avez les clés comme 1, et 2. La question est d'avoir les touches comme 'a' et 'b'. –

0

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} 
Questions connexes