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 }]
3 Réponses :
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
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.
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>
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] ...
print (list (set (i ["city"] for i in people)))