2010-09-24 25 views
98

Per la tupla, t = ((1, 'a'),(2, 'b')) dict(t) rendimenti {1: 'a', 2: 'b'}python tuple a dict

C'è un buon modo per ottenere {'a': 1, 'b': 2} (chiavi e vals scambiati)?

Sto volendo essere in grado di restituire 1 dato 'a' o 2 dato 'b', forse la conversione in un dict non è il modo migliore.

risposta

183

Prova:

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

+1 Belle !, ho dovuto provare con zip 'dict (zip (* zip (* t) [ :: - 1])) '. Questo è più lento, più brutto e usa più memoria ... probabilmente 3 volte. – kevpie

+1

+1 fantastico !!! È esattamente ciò di cui ho bisogno! :) –

+0

@kevpie La cosa meravigliosa di Python è che ci sono cento modi per esprimere come fare qualcosa, ognuno altrettanto interessante come il prossimo. – bjd2385

52

un metodo leggermente più semplice:

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

cosa rende questo più veloce? – maazza

+2

Le funzioni map e dict sono implementate in C e sono molto più veloci di qualsiasi versione python – jterrace

+0

Mi piace per avere il 'reverse' esplicitamente enunciato. –

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

Ancora più conciso se siete su Python 2.7:

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

Se non ci sono più valori per la stessa chiave, il seguente codice ne aggiungerà valori a un elenco corrispondente alla loro chiave,

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

Perché lo rende difficile? si può semplicemente dire:

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

Questa è una risposta sbagliata alla domanda 'C'è un buon modo per ottenere {' a ': 1,' b ': 2} (chiavi e vals scambiati)?'. Nella tua risposta hai le chiavi 1 e 2. La domanda è di avere le chiavi come 'a' e 'b'. –

0

Qui ci sono modi paio di farlo:

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