3
votes

Comment obtenir des valeurs uniques en Python en utilisant la compréhension de liste / dictée

Je n'ai besoin d'obtenir que des valeurs uniques du champ "ville" de mon dictionnaire. Je dois le faire en utilisant la compréhension de liste / dict.

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

Je l'ai fait avec la boucle de cette façon:

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)

Mais je n'ai pas Je n'ai pas traité de la compréhension de liste / dict avant. Je ne peux imprimer que toutes les valeurs comme celle-ci:

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 }]


1 commentaires

print (list (set (i ["city"] for i in people)))


3 Réponses :


4
votes

Compréhension de liste et transmettez-la à un ensemble.

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

note: en fait, il s'agit d'une expression de générateur , pas d'une compréhension de liste, mais dans ce cas ils sont équivalents dans la plupart des cas


2 commentaires

Pourquoi faire une compréhension de liste et la convertir ensuite en un ensemble alors que vous pouvez directement faire une compréhension d'ensemble?


@glhr: correct. En fait, ce que j'ai écrit n'est pas une compréhension de liste.



2
votes

Les entrées d'un ensemble sont uniques par définition, donc une compréhension d'ensemble est exactement ce dont vous avez besoin ici:

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

Sortie:

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

p>


0 commentaires

0
votes

Tout d'abord, notez que votre liste contient deux syntaxes pour la définition du dictionnaire: dict + mots-clés et clé: valeur à l'intérieur des accolades. Ce n'est pas un problème, mais c'est bizarre.

Deuxièmement, en Python, vous n'avez généralement pas besoin de l'index de la boucle:

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

C'est la même chose que: p>

>>> 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']

Si vous avez besoin de l'index, vous avez le mot-clé enumerate :

>>> 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}

Troisième:

for y in people:
    print(y)

fait une copie (superficielle) de y et l'assigne à dict_comp . Ce n'est pas obligatoire dans votre cas:

    dict_comp = {k:v for (k, v) in y.items()}

Quatrièmement, dict.fromkeys est le set du pauvre homme. Les deux solutions sont à peu près équivalentes, mais set perd l'ordre d'insertion (testé en 3.6) alors que dict.fromkeys conserve l'ordre d'insertion d'une clé (> = 3.6):

for x, y in enumerate(people):
    ...

Si vous voulez l'ordre de la première apparition d'une clé, vous pouvez également écrire:

for y in people:
    ...

Chaque fois qu'un la nouvelle ville est rencontrée, la compréhension de la liste l'ajoute à la sortie et au vu set (attention: effet secondaire dans la compréhension de la liste):

for x in range(len(people)):
    y = people[x]
    ...


0 commentaires