2011-03-20 9 views
11

Me gustaría usar la lista de comprensión en la siguiente lista;Comprensión de la lista para extraer una lista de tuplas del diccionario

movie_dicts = [{'title':'A Boy and His Dog', 'year':1975, 'rating':6.6}, 
      {'title':'Ran', 'year':1985, 'rating': 8.3}, 
      {'title':'True Grit', 'year':2010, 'rating':8.0}, 
      {'title':'Scanners', 'year':1981, 'rating': 6.7}] 

utilizando mis conocimientos de lista por comprensión y diccionarios, sé que

movie_titles = [x['title'] for x in movie_dicts] 
print movie_titles 

imprimirá una lista con los títulos de películas.

Para extrae una lista de (título, año) tuplas que he probado -

movie_tuples = [x for ('title','year') in movie_dicts] 
print movie_tuples 

y recibo el SyntaxError error: No se puede asignar a literal

estoy seguro sobre cómo buscar a los pares de dos (específica) de clave/valor utilizando la lista de comprensión (hacerlo generaría una tupla de forma automática?)

Respuesta

23
movie_dicts = [ 
    {'title':'A Boy and His Dog', 'year':1975, 'rating':6.6}, 
    {'title':'Ran', 'year':1985, 'rating': 8.3}, 
    {'title':'True Grit', 'year':2010, 'rating':8.0}, 
    {'title':'Scanners', 'year':1981, 'rating': 6.7} 
] 

title_year = [(i['title'],i['year']) for i in movie_dicts] 

da

[('A Boy and His Dog', 1975), 
('Ran', 1985), 
('True Grit', 2010), 
('Scanners', 1981)] 

O

import operator 
fields = operator.itemgetter('title','year') 
title_year = [fields(i) for i in movie_dicts] 

que da exactamente el mismo resultado.

+3

En realidad los soportes * * son necesarios dentro de los LC: P Puedes dejarlos fuera en asignaciones, declaraciones de retorno, rendimiento (prácticamente en cualquier otro lugar, eso es todo lo que puedo pensar en este momento). –

+1

Si está utilizando itemgetter, también puede usar 'map (fields, movie_dict)' en lugar de LC –

+0

@Jochen: he probado esto, está en lo cierto. D'oh! –

2
[(movie_dict['title'], movie_dict['year']) for movie_dict in movie_dicts] 

Recuerde, xs = [expr for target in expr2] es equivalente (casi - ignorando StopIteration por simplicidad) a:

xs = [] 
for target in expr2: 
    xs.append(expr) 

Así target tiene que ser un viejo nombre de la variable normal o alguna tupla para descomprimir a. Pero dado que movie_dicts no contiene secuencias para descomprimir sino simples valores simples (dicts), debe limitarlo a una variable. Luego, cuando se agrega a la lista que se está generando, puede crear una tupla y hacer cualquier otra cosa que quiera hacer con el elemento actual.

3

Esta versión cuenta con un mínimo de repetir siempre lo mismo:

>>> fields = "title year".split() 
>>> movie_tuples = [tuple(map(d.get,fields)) for d in movie_dicts] 
0

Si usted no tiene que utilizar una lista por comprensión, siempre se puede hacer:

list(d.iteritems()) 
Cuestiones relacionadas