2011-03-20 78 views
11

我想在下面的列表中使用列表理解;列表理解从字典中提取元组列表

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}] 

用我的列表理解和字典的知识,我知道

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

将打印电影标题的列表。

为了提取的(名称,年份)的元组我已经尝试了列表 -

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

,我收到错误语法错误:无法分配给字面

我不确定有关如何使用列表解析来获取两个(具体的)键/值对(这样做会产生一个元组自动?)

回答

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] 

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

OR

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

这使完全相同的结果。

+3

其实括号*是*必要里面的LCs:P你可以把它们留在任务,回报,收益声明(几乎所有其他地方,这些都是我现在可以想到的)。 – 2011-03-21 00:16:29

+1

如果你正在使用itemgetter,你也可以使用'map(fields,movie_dict)'而不是LC – 2011-03-21 00:30:46

+0

@Jochen:已经测试过了,你是对的。 D'哦! – 2011-03-21 00:33:35

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

记住,xs = [expr for target in expr2]相当于(几乎是 - 忽略StopIteration为简单起见)到:

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

所以target需要是一个普通的旧变量名或一些元组解压到。但由于movie_dicts不包含要解压缩的序列,而是包含简单的单值(字典),所以您必须将其限制为一个变量。然后,当您追加到正在生成的列表时,您可以创建一个元组并执行您想要对当前项目执行的其他操作。

3

这个版本有一个最小重复自己:

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

如果你没有使用列表理解,你总是可以做:

list(d.iteritems())