6
votes

Remembing Noms de clés dans une liste de dictionnaires

Qu'est-ce qu'un moyen pythononique de remapper chaque clé de dictionnaire dans une liste de dictionnaires à clé identique à différents noms de clés? Par exemple, xxx

doit transformer en xxx

(Je dois faire la transformation afin de correspondre à une spécification de sortie pour une API I ' m travaillant sur.)


3 commentaires

"meilleur" de quelle mesure? Il y a plusieurs manières de faire ça. Facile à lire? Peu de mémoire? Vite?


Bon point. Que diriez-vous de "la plupart pythoniques"? :) Alors probablement s'appuyant sur facile à lire, dans le moins de lignes de code. Je trouve que, typiquement, lorsque je suis confronté à ce type de scénario, il y a généralement une fonctionnalité de python intégrée cool ou intégrée qui fait que cela se produise, plutôt que d'écrire une boucle de force brute, bien que je suis ouvert à cela. La liste sera généralement inférieure à 20 dictionnaires afin que la mémoire et la vitesse ne soient pas aussi importantes pour moi.


Stackoverflow.com/ Questions / 644178 / ...


4 Réponses :


2
votes

Il suffit d'utiliser un compréhension de la liste

>>> d = [{'type_id': 6, 'type_name': 'Type 1'}, {'type_id': 12, 'type_name': 'Type 2'}]
>>> print [{'type':x['type_id'],'name':x['type_name']} for x in d]
[{'type': 6, 'name': 'Type 1'}, {'type': 12, 'name': 'Type 2'}]
>>>


1 commentaires

Je suis toujours surpris de voir combien vous pouvez faire avec des compréhensions de la liste.



8
votes

python> = 2,7 (en utilisant un compréhension dict ):

transform = {"type_id": "type", "type_name": "name"}
new_list = [dict((transform[k], v) for k, v in d.items()) for d in old_list]


1 commentaires

La compréhension dictionnaire imbriquée à l'intérieur d'une compréhension de la liste est une construction très puissante et flexible pour faire des transformations. Je le considérerais certainement pour un cas plus complexe, mais je compte de la simplicité de mes besoins, j'aime bien Joran est un peu mieux puisqu'il est plus simple.



1
votes

La nouvelle façon conviviale et facile à lire:

>>> list2 = []
>>> for d in list1:
...     x = dict()
...     for k,v in d.iteritems():
...        x[k.split('_')[1]] = v
...     list2.append(x)
...
>>> list2
[{'name': 'Type 1', 'id': 6}, {'name': 'Type 2', 'id': 12}]


0 commentaires

3
votes

Que diriez-vous de modifications actuelles?

>>> for D in L:
    for k,k_new in transform.items():
        value = D.pop(k,None)
        if value is not None:
            D[k_new] = value


0 commentaires