2015-08-03 18 views
5

Entschuldigung im Voraus für dieses Wesen so eine neue Frage. Ich fange gerade an, python zu schreiben, und ich habe einige Verwirrung über das Knallen von Werten von geschachtelten Wörterbüchern/Listen gehabt, also schätze ich jede mögliche Hilfe!Python verschachtelte Listen/Wörterbücher und Poping-Werte

Ich habe diese Probe json Daten:

{ "scans": [ 
    { "status": "completed", "starttime": "20150803T000000", "id":533}, 
    { "status": "completed", "starttime": "20150803T000000", "id":539} 
] } 

Ich mag würde die 'id' aus dem "Scans" -Taste Pop.

scheint nicht zu funktionieren, weil die verschachtelten Schlüssel/Werte innerhalb einer Liste sind. d. h.

>>> print json.dumps(json_data['scans']['id']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 

Kann mir jemand in die richtige Richtung zeigen, damit das funktioniert? Mein langfristiges Ziel dabei ist es, eine For-Schleife zu erstellen, die alle IDs in ein anderes Wörterbuch oder eine Liste platziert, die ich für eine andere Funktion verwenden kann.

+0

von Ihrem letzten Kommentar scheint es, als ob Sie bereits eine ziemlich gute Idee von dem, was getan werden muss. Warum nicht versuchen, es zu programmieren und uns deinen Versuch zu zeigen? – goncalopp

+0

dachte, ich würde diesen Thread nicht mit einer Million gescheiterten Beispielen von dem, was ich versuchte, um die Dinge für zukünftige Leser, die ein ähnliches Problem haben, zu halten, sprengen. – dobbs

Antwort

2

json_data['scans'] gibt eine Liste von dicts, Sie versuchen, die Liste mit einem str dh []["id"] zu indizieren, die aus offensichtlichen Gründen versagt, so dass Sie den Index zu bekommen jedes Subelement verwenden müssen:

print json_data['scans'][0]['id'] # -> first dict 
print json_data['scans'][1]['id'] # -> second dict 

Oder zu sehen alle die Iterierte von id über die Liste der dicts lieferte mit json_data["scans"]:

for dct in json_data["scans"]: 
    print(dct["id"]) 

um auf eine Liste anhängen zu speichern:

all_ids = [] 
for dct in json_data["scans"]: 
    all_ids.append(dct["id"]) 

Oder eine Liste comp verwenden:

all_ids = [dct["id"] for dct in json_data["scans"]] 

Wenn es eine Chance ist der Schlüssel id nicht in jedem dict sein könnte, in verwenden, um zu überprüfen, bevor Sie Zugriff auf:

all_ids = [dct["id"] for dct in json_data["scans"] if "id" in dct] 
+0

perfekt! Ich habe die Indexposition nach [scans] vermisst. macht jetzt Sinn. Im zweiten Beispiel bin ich etwas verwirrt. das: print (d ["id"]) ist d die Indexposition? Ich dachte, du musst Indexpositionen innerhalb von Klammern setzen, um Werte – dobbs

+0

@ dobbs, wir über die Liste in der Schleife iterieren, so dass jedes "d" ist jedes tatsächliche 'Element/dict" aus der Liste, so dass wir auf das Diktat zugreifen Schlüssel 'ID', um jeden Wert zu erhalten –

0

Hier wie kann Sie iterieren über die Elemente und extrahieren alle IDs:

json_data = ... 
ids = [] 
for scan in json_data['scans']: 
    id = scan.pop('id') 
    # you can use get instead of pop 
    # then your initial data would not be changed, 
    # but you'll still have the ids 
    # id = scan.get('id') 
    ids.append(); 

Dieser Ansatz funktioniert auch:

ids = [item.pop('id') for item in json_data['scans']]