Учет списка для извлечения списка кортежей из словаря

Я хотел бы использовать понимание списка в следующем списке;

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: не могу назначить литерал

Я не уверен, как получить две (конкретные) пары ключ/значение, используя понимание списка (при этом автоматически генерируется кортеж?)

Ответ 1

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]

который дает точно такой же результат.

Ответ 2

Эта версия имеет минимум повторения:

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

Ответ 3

[(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 не содержит последовательностей для распаковки из простых простых значений (dicts), вы должны ограничить их одной переменной. Затем, когда вы добавляете к сгенерированному списку, вы можете создать кортеж и делать все, что хотите, с текущим элементом.

Ответ 4

Если вам не нужно использовать понимание списка, вы всегда можете:

list(d.iteritems())