2011-03-06 10 views
5

que tengo:Python: dict postal con claves

list_nums = [1,18] 
list_chars = ['a','d'] 

que quiero:

list_num_chars = [{'num':1, 'char':'a'}, 
        {'num':18, 'char':'d'}] 

¿Existe una solución más elegante que:

list_num_chars = [{'num':a, 'char':b} for a,b in zip(list_nums, list_chars)] 
+4

Su solución ya es elegante en cuanto a que es pitonica, fácil de leer y se asemeja a la salida. No estoy seguro de qué más podría pedir: p – Kai

+0

¿Quiere decir que desea tener un tipo de "macro" que funcionará en cualquiera de esas listas sin tener que cambiar los nombres; Por ejemplo, si lo pasa "list_foo", usará la tecla "foo"? – Vamana

+0

@Vamana: no, nada de eso. – ash

Respuesta

2

Si las listas iniciales son muy de largo, es posible que desee utilizar itertools.izip() en lugar de zip() para un rendimiento ligeramente mejorado y menos uso de memoria, pero aparte de esto I No se puede pensar en una manera significativamente "mejor" de hacerlo.

+0

¡Muy bien, gracias! – ash

3
map(dict, map(lambda t:zip(('num','char'),t), zip(list_nums,list_chars))) 

da:

[{'char': 'a', 'num': 1}, {'char': 'd', 'num': 18}] 
1

declarar una nueva variable que son las llaves de su dict

from itertools import izip 
nums = [1,18] 
chars = ['a','d'] 
keys = ["num", "char"]  # include list of keys as an input 

que da una solución ligeramente más elegante, creo.

[dict(zip(keys,row)) for row in izip(nums,chars)] 

Es definitivamente más elegante cuando hay más teclas (que es por eso que empecé la caza de esta solución en el primer lugar :)

Si lo desea, este truco da lo mismo que un generador:

(dict(zip(keys,row)) for row in izip(nums,chars)) 
Cuestiones relacionadas