Во-первых, обратите внимание, что ваш список содержит два синтаксиса для определения словаря: dict + keywords
и key: value
внутри похвалы.Это не проблема, но это странно.
Во-вторых, в Python вам обычно не нужен индекс цикла:
for x in range(len(people)):
y = people[x]
...
Это то же самое, что:
for y in people:
...
Если вам нужен индекс, у вас есть ключевое слово enumerate
:
for x, y in enumerate(people):
...
Третье:
dict_comp = {k:v for (k, v) in y.items()}
делает (мелкую) копию y
и присваиваетэто к dict_comp
.Это не требуется в вашем случае:
for y in people:
print(y)
В-четвертых, dict.fromkeys
- это число бедняков set
.Оба решения примерно эквивалентны, но set
теряет порядок вставки (проверено в 3.6), тогда как dict.fromkeys
сохраняет порядок вставки ключа (> = 3.6):
>>> set(person['city'] for person in people)
{'Rome', 'Chicago', 'New York', 'Brighton', 'Liverpool', 'Berlin'}
>>> dict.fromkeys(person['city'] for person in people)
{'Liverpool': None, 'New York': None, 'Chicago': None, 'Brighton': None, 'Berlin': None, 'Rome': None}
Если вы хотитеПорядок первого появления ключа, вы также можете написать:
>>> seen = set()
>>> [person['city'] for person in people if not (person['city'] in seen or seen.add(person['city']))]
['Liverpool', 'New York', 'Chicago', 'Brighton', 'Berlin', 'Rome']
Каждый раз, когда встречается новый city
, понимание списка добавляет его к выходу и к seen
set
(будьте осторожны: побочный эффект внутри списка понимания):
>>> seen
{'Berlin', 'Liverpool', 'Rome', 'New York', 'Brighton', 'Chicago'}