2012-10-31 4 views
6

Was ist eine pythonische Methode, um jeden Wörterbuchschlüssel in einer Liste von Wörterbüchern mit identischen Schlüsseln verschiedenen Schlüsselnamen zuzuordnen? ZBNeuzuordnung von Schlüsselnamen in einer Liste von Wörterbüchern

[{'type_id': 6, 'type_name': 'Type 1'}, {'type_id': 12, 'type_name': 'Type 2'}] 

müssen verwandeln sich in

[{'type': 6, 'name': 'Type 1'}, {'type': 12, 'name': 'Type 2'}] 

(ich die Transformation zu tun, um brauchen arbeite ich an eine Ausgabespezifikation für eine API zu entsprechen.)

+0

"best" von welchem ​​Maße? Es gibt viele Möglichkeiten, dies zu tun. Leicht zu lesen? Wenig Speicher? Schnell? – Hamish

+0

Guter Punkt. Wie wäre es mit "am meisten Python"? :) Also wahrscheinlich in Richtung leicht zu lesen, in den wenigsten Zeilen des Codes. Ich finde, dass normalerweise, wenn ich mit dieser Art von Szenario konfrontiert bin, normalerweise eine coole oder interessante integrierte Python-Funktionalität vorhanden ist, die es ermöglicht, anstatt eine Brute-Force-Schleife zu schreiben, obwohl ich dafür offen bin. Die Liste wird in der Regel weniger als 20 Wörterbücher enthalten, sodass Speicher und Geschwindigkeit für mich nicht so wichtig sind. –

+0

http://stackoverflow.com/questions/644178/how-do-i-re-map-python-dict-keys – Pramod

Antwort

2

nur verwenden list comprehension

>>> 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'}] 
>>> 
+0

Ich bin immer erstaunt, wie viel Sie mit List Comprehensions tun können. –

8

Python> = 2,7 (unter Verwendung eines dict comprehension):

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

Python> = 2.4 (mit dem dict Konstruktor):

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

Das verschachtelte Wörterbuchverständnis innerhalb eines Listenverständnisses ist ein sehr mächtiges und flexibles Konstrukt für Transformationen. Ich würde es definitiv für einen komplexeren Fall halten, aber angesichts der Einfachheit meiner Bedürfnisse mag ich Joran ein bisschen besser, weil es einfacher ist. –

1

Die neue benutzerfreundliche, einfach zu lesen Weg:

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

Das wäre 'k.split ('_') [0]'. –

3

Wie wäre es inplace Änderungen ?

>>> transform = {"type_id": "type", "type_name": "name"}  
>>> for D in L: 
    for k,k_new in transform.items(): 
     D[k_new] = D.pop(k)    
>>> L 
[{'type': 6, 'name': 'Type 1'}, {'type': 12, 'name': 'Type 2'}] 

Oder noch besser:

>>> 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 
Verwandte Themen