使用列表推导从字典中提取元组列表

13 投票
4 回答
13371 浏览
提问于 2025-04-16 14:05

我想在下面这个列表上使用列表推导;

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

但是我收到了一个错误,提示是 SyntaxError: can't assign to literal。

我不太确定如何使用列表推导来获取这两个(特定的)键/值对(这样做会自动生成一个元组吗?)

4 个回答

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

或者

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

这两者的结果是完全一样的。

撰写回答