Как получить уникальные значения в Python, используя понимание списка / dict - PullRequest
2 голосов
/ 24 апреля 2019

Мне нужно получить только уникальные значения из поля "город" в моем словаре.Мне нужно сделать это с использованием списка / диктов.

people = [ dict ( city = "Liverpool" , name = "Adam" , age = 24 ),
{ "city" : "New York" , "name" : "Dario" , "age" : 12 },
{ "city" : "New York" , "name" : "Mario" , "age" : 45 },
{ "city" : "Chicago" , "name" : "Paolo" , "age" : 27 },
{ "city" : "Brighton" , "name" : "Sven" , "age" : 19 },
{ "city" : "Berlin" , "name" : "Frank" , "age" : 52 },
{ "city" : "Rome" , "name" : "Aleksander" , "age" : 33 }
{ "city" : "Rome" , "name" : "Adam," , "age" : 24 }]

Я сделал это с помощью цикла следующим образом:

unique_cities = []
for x in range(len(people)):
    y = people[x]
    cities = y.get('city')
    unique_cities.append(cities)
unique_cities = list(dict.fromkeys(unique_cities))
print(unique_cities)

Но я не имел дело с пониманием списков / диктовдо.Я могу только напечатать все значения, как это:

for x in range(len(people)):
    y = people[x]
    dict_comp = {k:v for (k, v) in y.items()}
    print(dict_comp)

Ответы [ 3 ]

4 голосов
/ 24 апреля 2019

Составьте список и передайте его набору.

set(person['city'] for person in people)

примечание: на самом деле это генераторное выражение , а не понимание списка, но в этом случае они эквивалентны для большинства целей

2 голосов
/ 24 апреля 2019

Записи в наборе уникальны по определению, поэтому понимание набора - именно то, что вам нужно:

{d["city"] for d in people}

Вывод:

{'Berlin', 'Rome', 'Brighton', 'Liverpool', 'Chicago', 'New York'}
0 голосов
/ 26 апреля 2019

Во-первых, обратите внимание, что ваш список содержит два синтаксиса для определения словаря: 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'}
...