2012-09-27 22 views
5

Cómo convertir la tupla:tupla a dict: una de las claves y valores múltiples

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

en un diccionario:

que he probado en una consola:

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

Ahora el siguiente script falla al hacer el trabajo:

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 

que tienen el error:

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' 

Parece ser diferente de $ >>> d [e [0] [0] = t] [0] [1] $. Gracias por su ayuda

JP

PS ¿Hay una mejor manera de hacer la conversión?

+0

'{'1' :('a', 'A') ...' ¿Tiene importancia que tenga una tupla en lugar de una lista como valor? –

+0

Lo siento, me aparece el error: debe ser d [ob [0]] = ob [1] no d [ob [0]] = d [ob [1]] –

+0

@Waleed Khan: no realmente, una lista podría ser bien también. –

Respuesta

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

vuelve

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

Esto solo funciona para python 2.7 o posterior. – 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

Puede utilizar defaultdict desde el módulo de colecciones (a pesar de que va a funcionar mejor para las listas, no tuplas):

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 simplemente añadir tuplas juntos:

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

Una opción muy limpio y elegante sería hacer lo siguiente:

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

Tenga en cuenta que quieren tuplas, no listas. – georg

0

Para ser completa, se puede usar un efecto secundario de una lista por comprensión a hacer esto en una sola línea:

>>> 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 efecto secundario de un conjunto de comprensión (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']} 

Esto es más por interés, sintaxis recomendada, pero interesante, no obstante.

Cuestiones relacionadas