2011-01-07 12 views
9

tengo una cadena en la forma de:Creación de un diccionario de una cadena

s = 'A - 13, B - 14, C - 29, M - 99' 

y así sucesivamente (la longitud varía). ¿Cuál es la forma más fácil de crear un diccionario a partir de esto?

A: 13, B: 14, C: 29 ... 

Sé que puedo dividir pero no puedo obtener la sintaxis correcta de cómo hacerlo. Si me divido en -, ¿cómo puedo unir las dos partes?

Iterar esto parece ser muy doloroso.

+0

Tengo una pregunta relacionada: ¿Qué pasa si mi cadena se ve así: 'A-13-27', B-35-42' y quiero un diccionario de la siguiente manera: A: (13,27), B: (35,42)? – Shushiro

Respuesta

12
>>> s = 'A - 13, B - 14, C - 29, M - 99' 
>>> dict(e.split(' - ') for e in s.split(',')) 
{'A': '13', 'C': '29', 'B': '14', 'M': '99'} 

EDIT: La siguiente solución es que cuando se desea que los valores como enteros, que creo que es lo que desea.

>>> dict((k, int(v)) for k, v in (e.split(' - ') for e in s.split(','))) 
{'A': 13, ' B': 14, ' M': 99, ' C': 29} 
21

Para resolver su ejemplo, usted puede hacer esto:

mydict = dict((k.strip(), v.strip()) for k,v in 
       (item.split('-') for item in s.split(','))) 

Se hace 3 cosas:

  • dividir la cadena en "<key> - <value>" partes: s.split(',')
  • dividir cada parte en "<key> ", " <value>" pares: item.split('-')
  • eliminar el espacio en blanco de cada par: (k.strip(), v.strip())
+1

Woah, me siento realmente estúpido ahora mismo. Esto * nunca * se me ocurrió. – user225312

4
>>> dict((k.strip(),int(v.strip())) for k,v in (p.split('-') for p in s.split(','))) 
{'A': 13, 'B': 14, 'M': 99, 'C': 29} 
+0

+1 Por pensar en convertir los números en enteros. Aunque estaría tentado de dividirlo en dos pasos para hacerlo más claro. –

2
dict((p.split(' - ') for p in s.split(','))) 
0

Esto debería funcionar:

dict(map(lambda l:map(lambda j:j.strip(),l), map(lambda i: i.split('-'), s.split(',')))) 

Si no quieren despojar, acaba de hacer:

dict(map(lambda i: i.split('-'), s.split(','))) 
+0

¡Ah! ¡Mis soluciones no convierten números enteros! – rubik

1

Aquí es una respuesta que no lo hace use expresiones de generador y utiliza replace en lugar de strip.

>>> s = 'A - 13, B - 14, C - 29, M - 99' 
>>> d = {} 
>>> for pair in s.replace(' ','').split(','): 
...  k, v = pair.split('-') 
...  d[k] = int(v) 
... 
>>> d 
{'A': 13, 'C': 29, 'B': 14, 'M': 99} 
Cuestiones relacionadas