4
votes

Moyen rapide d'obtenir les clés dans une liste de dictionnaires

Prenons l'exemple ci-dessous:
m = [{'a': 1}, {'b': 2}]
Je voulais trouver un moyen court de former une liste des clés dans m , tout comme ['a', 'b'] . Quel serait le moyen le plus court ou le plus simple plutôt que d'utiliser des boucles for traditionnelles? Peut-être un sucre syntaxique?


0 commentaires

4 Réponses :


10
votes

Vous pouvez utiliser la compréhension de liste, un sucre sintactique des boucles for:

keys_list = list(set(x for d in m for x in d.keys()))

Notez que si vos dictionnaires ont des clés en commun, elles apparaîtront plusieurs fois dans le résultat. >

Si vous ne voulez que des clés uniques, vous pouvez le faire:

keys_list = [x for d in m for x in d.keys()]


12 commentaires

Mais cela ne donne pas une chaîne non? Cela donne quelque chose comme [dict_keys (['a']), dict_keys (['b'])] , au lieu de ['a', 'b']


Ouais, maintenant je change la réponse, désolé.


Vous pouvez même l'écrire plus simplement: [x pour x en d pour d en m] car l'itération sur un dictionnaire renvoie les clés.


Merci, je ne savais pas. Si cela ne vous dérange pas, je modifie le message avec votre suggestion.


J'ai déjà cette approche dans ma réponse @dome Je pense que vous voudrez peut-être éviter la duplication?


Désolé, je n'ai pas vu.


avez-vous testé ce code? @dôme


Juste corrigé l'erreur.


Je ne sais pas comment la dernière approche donne des clés uniques, essayez-la simplement avec m = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]


Vous avez raison, corrigé.


Cool, +1 pour la correction. Pourriez-vous également voter pour ma réponse :)


Oui bien sûr.



6
votes

Une simple double boucle for avec compréhension de liste devrait faire l'affaire. Parcourez la liste, et pour chaque élément de la liste, parcourez les clés

In [19]: m = [{'a':1, 'b':2},{'a':3,'b':4}]                                                                                                                                                                                  

In [20]: r = [k for item in m for k in item]                                                                                                                                                                                 

In [21]: r                                                                                                                                                                                                                   
Out[21]: ['a', 'b', 'a', 'b']

In [22]: r = list(set(r))                                                                                                                                                                                                    

In [23]: r                                                                                                                                                                                                                   
Out[23]: ['b', 'a']

Si la liste contient des clés en double, convertissez simplement la sortie finale en un ensemble puis en une liste pour obtenir clés uniques

In [5]: m = [{'a':1},{'b':2}]                                                                                                                                                                                                

In [6]: [k for item in m for k in item]                                                                                                                                                                                      
Out[6]: ['a', 'b']


0 commentaires

2
votes
  1. Extraire toutes les clés de dictés dans une liste de listes
  2. Convertissez-les en une liste en itertools.chain
  3. from itertools import chain
    
    a = [{'a': 1, 'c': 2}, {'b': 2}]
    b = [d.keys() for d in a]
    list(chain(*b))
    

    renverra:

    ['c', 'a', 'b']


0 commentaires

1
votes

Si vous ne voulez que des clés uniques, procédez comme suit:

print([x for d in m for x in d])

et celle-ci contient des doublons:

m = [{'a':1},{'b':2},{'b':3}]
print({x for d in m for x in d})


2 commentaires

avez-vous testé votre code? @alireza yazdandoost


@ncica j'ai édité ça :) maintenant c'est ok