2011-03-20 102 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())