Понимание списка для извлечения списка кортежей из словаря - PullRequest
11 голосов
/ 21 марта 2011

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

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: невозможно присвоить литералу

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

Ответы [ 4 ]

23 голосов
/ 21 марта 2011
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]

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

3 голосов
/ 21 марта 2011

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

>>> fields = "title year".split()
>>> movie_tuples = [tuple(map(d.get,fields)) for d in movie_dicts]
2 голосов
/ 21 марта 2011
[(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), вы должны ограничить его одной переменной.Затем, когда вы добавляете к генерируемому списку, вы можете создать кортеж и делать все, что вы хотите сделать с текущим элементом.

0 голосов
/ 07 мая 2012

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

list(d.iteritems())
...