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, doit transformer en p> (Je dois faire la transformation afin de correspondre à une spécification de sortie pour une API I ' m travaillant sur.) p> p>
4 Réponses :
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'}]
>>>
Je suis toujours surpris de voir combien vous pouvez faire avec des compréhensions de la liste.
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]
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.
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}]
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
"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 / ...