繁体   English   中英

如何使用列表/字典理解获取Python中的唯一值

[英]How to get unique values in Python using list/dict comprehension

我只需要从字典中的“ city”字段中获取唯一值。 我需要使用列表/字典理解。

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)

列出理解,并将其传递给集合。

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

注意:实际上,这是一个生成器表达式 ,而不是列表理解,但是在这种情况下,它们在大多数情况下是等效的

集合中的条目根据定义是唯一的,因此集合理解正是您所需要的:

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

输出:

{'Berlin', 'Rome', 'Brighton', 'Liverpool', 'Chicago', 'New York'}

首先,请注意,您的列表包含两种用于字典定义的语法: dict + keywordskey: value赞美中的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 dict.fromkeys了插入顺序(在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'}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM