2012-06-12 29 views
7

Tengo una tupla, como ('key1', 'value1') que quiero agregar a un diccionario por lo que es como {'key1': 'value1'} pero no haciendo algo como dictionary[t[0]] = t[1].Agregue una tupla de 2 valores a dict como clave: valor

El contexto es el siguiente, tengo una regla de repetición que se parece a:

FREQ=WEEKLY;UNTIL=20120620T233000Z;INTERVAL=2;BYDAY=WE,TH 

Y yo quiero tener un diccionario como:

recurrence = { 
    'freq' : 'weekly', 
    'until' : '20120620T233000Z', 
    'interval' : '2', 
    'byday' : 'we,th' 
} 

Y yo estoy haciendo algo como esto :

for rule in recurrence.split(';'): 
    r = rule.split('=') 
    rules[r[0]] = r[1] 

Y no me gusta en absoluto. ¿Hay una forma más pitonica de hacerlo?

Respuesta

6

Use una comprensión:

rules.update(rule.split('=', 1) for rule in recurrence.split(';')) 

Esto es, si el dict rules ya existe; de lo contrario usar

rules = dict(rule.split('=', 1) for rule in recurrence.split(';')) 

Esto funciona porque el constructor y dictdict.update tanto aceptan un iterador produciendo pares clave/valor.

+4

'.partition ('=') [:: 2]' if missing '=' es válido/puede ser ignorado – jfs

+1

Este comentario es lo que amo de SO. Estaba buscando una manera limpia de evitar el "ValueError: elemento de secuencia de actualización de diccionario # 2 tiene longitud 1; 2 es obligatorio" al desempaquetar una cadena que tenía valores perdidos como este: 'user_id = "123", access_token = "XXXXXX ", marca de tiempo". Este comentario fue un momento "ah-ha" que me ha enseñado algo muy valioso. –

1

La función dict transformará su tupla de tuplas en un diccionario clave: valor. ¿Qué hay de esto, el diccionario de

t=((1,2),(3,4)) 
dict(t) 
{1:2,3:4} 
1

uso comprensión:

>>> strs="FREQ=WEEKLY;UNTIL=20120620T233000Z;INTERVAL=2;BYDAY=WE,TH" 
>>> dic={key: value for key, value in (rule.split("=") for rule in strs.split(";"))} 
>>> print(dic) 

{'BYDAY': 'WE,TH', 'FREQ': 'WEEKLY', 'INTERVAL': '2', 'UNTIL': '20120620T233000Z'} 
+1

Esta es una manera fea de hacerlo. Utilice el constructor 'dict()' y pase las tuplas listas, o encapsule la tupla desempaquetando en una expresión de generador anidado: '{clave: valor para clave, valor en (regla.split (" = ") para regla en datos .split (";"))} 'para evitar realizar operaciones muchas veces. –

+0

@ sugerencia de Tattyware implementada. –

Cuestiones relacionadas