2012-09-27 17 views
5

Come convertire la tupla:tuple a DICT: una chiave e più valori

t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 

in un dizionario:

ho provato in una console:

>>> d={} 
>>> t[0] 
(1, 'a') 
>>> d[t[0][0]]=t[0][1] 
>>> d 
{1: 'a'} 
>>> t[0][0] in d 
True 
>>> d[t[1][0]]=t[1][1] 
>>> d 
{1: 'A'} 
>>> d[t[0][0]]=t[0][1] 
>>> d[t[1][0]]=d[t[1][0]],t[1][1] 
>>> d 
{1: ('a', 'A')} 

Ora il seguente script non riesce a svolgere il lavoro:

t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
print "{'1':('a','A'),'2':('b','B'),'3':('c','C')} wanted, not:",dict(t) 
d={} 

for c, ob in enumerate(t): 
    print c,ob[0], ob[1] 
    if ob[0] in d: 
     print 'test' 
     d[ob[0]]=d[ob[0]],ob[1] 
     print d 

    else: 
     print 'else', d, ob[0],ob[1] 
     d[ob[0]]=d[ob[1]]   # Errror is here 
     print d 
print d 

ho l'errore:

Traceback (most recent call last): 
    File "/home/simon/ProjetPython/python general/tuple_vers_dic_pbkey.py", line 20, in <module> 
    d[ob[0]]=d[ob[1]] 
KeyError: 'a' 

Sembra essere diverso da $ >>> d = t [0] [1] $ [[0] [0] t]. Grazie per il vostro aiuto

JP

PS C'è un modo migliore per fare la conversione?

+0

'{'1' :('a', 'A') ...' È importante avere una tupla al posto di una lista come valore? –

+0

Spiacente, ho ricevuto l'errore: dovrebbe essere d [ob [0]] = ob [1] non d [ob [0]] = d [ob [1]] –

+0

@Waleed Khan: non proprio, una lista potrebbe essere bene anche –

risposta

3
import itertools as it 
t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 

{k:tuple(x[1] for x in v) for k,v in it.groupby(sorted(t), key=lambda x: x[0])} 

rendimenti

{'1': ('A', 'a'), '2': ('B', 'b'), '3': ('C', 'c')} 
+0

Questo funziona solo con Python 2.7 o successivo. – John

1
t = (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
foo = {} 
for i in t: 
    if i[0] not in foo: 
     foo[i[0]] = [i[1]] 
    else: 
     foo[i[0]].append(i[1]) 
foo # {'3': ['c', 'C'], '2': ['b', 'B'], '1': ['a', 'A']} 
6

È possibile utilizzare defaultdict dal modulo collezioni (anche se funziona meglio per gli elenchi, non tuple):

t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 

from collections import defaultdict 
d = defaultdict(list) 
for k, v in t: 
    d[k].append(v) 

d = {k:tuple(v) for k, v in d.items()} 
print d 

o semplicemente aggiungere tuple insieme:

t = (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
d = {} 
for k, v in t: 
    d[k] = d.get(k,()) + (v,) 
print d  
0
>>> t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
>>> d1 = {} 
>>> for each_tuple in t: 
    if each_tuple[0] in d1: 
     d1[each_tuple[0]] = d1[each_tuple[0]] + list(each_tuple[1]) 
    else: 
     d1[each_tuple[0]] = list(each_tuple[1]) 

>>> d1 
{'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']} 
1

Un'opzione super pulito ed elegante sarebbe quella di effettuare le seguenti operazioni:

>>> d = {} 
>>> for k,v in (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')): 
...  d.setdefault(k, []).append(v) 
... 
>>> d 
{'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']} 
+0

Nota che vogliono le tuple, non le liste. – georg

0

Per essere completa, è possibile utilizzare un effetto collaterale di una lista di comprensione per fare questo in una sola riga:

>>> tups=t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
>>> d={} 
>>> [d.setdefault(k,[]).append(v) for k,v in tups] 
[None, None, None, None, None, None] 
>>> d 
{'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']} 

o effetto collaterale di una comprensione set (Py 2.7+ o 3.1+):

>>> d={} 
>>> {d.setdefault(k,[]).append(v) for k,v in tups} 
set([None]) 
>>> d 
{'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']} 

Questo è più per interesse - sintassi non consigliata - ma interessante comunque.

Problemi correlati