2012-03-29 8 views
8

Supongamos que tengo el siguiente diccionario y lista:¿Es posible tomar un "segmento" ordenado de un diccionario en Python basado en una lista de claves?

my_dictionary = {1:"hello", 2:"goodbye", 3:"World", "sand":"box"} 
my_list = [1,2,3] 

¿Hay una manera directa (Pythonic) para obtener los pares de valores clave fuera del diccionario para los que las claves son elementos de la lista, en un orden definido por el orden de la lista?

El enfoque ingenuo consiste simplemente en iterar sobre la lista y extraer los valores en el mapa uno por uno, pero me pregunto si python tiene el equivalente a la división de listas para diccionarios.

+0

Dado que la cuestión es sobre el uso de una característica del lenguaje, lo único que realmente trató de Google. =) – merlin2011

Respuesta

9

No sabe si es lo suficientemente Pythonic pero esto está funcionando:

res = [(x, my_dictionary[x]) for x in my_list] 

Ésta es una list comprehension, pero, si es necesario reiterar que la lista sólo una vez, también puede convertirlo en una expresión generadora, p.ej :

for el in ((x, my_dictionary[x]) for x in my_list): 
    print el 

Por supuesto, los métodos anteriores solo funcionan si todos los elementos de la lista están presentes en el diccionario; para dar cuenta de la clave no está presente caso se puede hacer esto:

res = [(x, my_dictionary[x]) for x in my_list if x in my_dictionary] 
1

una manera directa sería para recoger todos los elementos de la diccionario y comprobar si la clave está en la lista

>>> [e for e in my_dictionary.items() if e[0] in my_list] 
[(1, 'hello'), (2, 'goodbye'), (3, 'World')] 

la búsqueda anterior sería lineal, de modo que podría ganar algo de rendimiento mediante la conversión de la lista para configurar

>>> [e for e in my_dictionary.items() if e[0] in set(my_list)] 
[(1, 'hello'), (2, 'goodbye'), (3, 'World')] 

Y finalmente, si usted necesita un diccionario en lugar de una lista de claves, el valor de par que usted tuplas puede usar la comprensión del diccionario

>>> dict(e for e in my_dictionary.items() if e[0] in set(my_list)) 
{1: 'hello', 2: 'goodbye', 3: 'World'} 
>>> 
+1

Si esta es una buena idea o no depende del tamaño de la lista. Si la lista es muy pequeña, esto es un desperdicio. –

+0

¿No volverán a calcular su segundo y tercer ejemplo el conjunto (my_list) cada vez? – DSM

3

¿Qué tal esto? Tome cada artículo en my_list y páselo al método get del diccionario. También maneja las excepciones de las teclas faltantes reemplazándolas por None.

map(my_dictionary.get, my_list) 

Si quieren tupples zip que -

zip(my_list, map(my_dictionary.get, my_list)) 

Si usted quiere un nuevo dict, pasan a la tupple dict.

dict(zip(my_list, map(my_dictionary.get, my_list))) 
5
>>> zip(my_list, operator.itemgetter(*my_list)(my_dictionary)) 
[(1, 'hello'), (2, 'goodbye'), (3, 'World')] 
Cuestiones relacionadas