Учет списка для извлечения списка кортежей из словаря
Я хотел бы использовать понимание списка в следующем списке;
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())