2015-08-03 18 views
5

Ci scusiamo in anticipo perché questa è una domanda da principianti. Sto solo iniziando a scrivere python e ho avuto una certa confusione intorno ai valori popping dei dizionari/elenchi nidificati, quindi apprezzo qualsiasi aiuto!liste nested python/dizionari e valori popping

ho questo campione di dati JSON:

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

mi piacerebbe pop il 'id' fuori dal tasto "scansioni".

def listscans(): 
    response = requests.get(scansurl + "scans", headers=headers, verify=False) 
    json_data = json.loads(response.text) 
    print json.dumps(json_data['scans']['id'], indent=2) 

non sembra funzionare perché la chiave nidificata/i valori sono all'interno di una lista. Ad esempio

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

qualcuno può indicarmi la direzione giusta per farlo funzionare? il mio obiettivo a lungo termine con questo è quello di creare un ciclo for che collochi tutti gli id ​​in un altro dizionario o lista che posso usare per un'altra funzione.

+0

dal tuo ultimo commento sembra che tu abbia già una buona idea di ciò che deve essere fatto. Perché non provare a codificarlo e mostrarci il tuo tentativo? – goncalopp

+0

ho pensato che non avrei fatto saltare questo thread con un milione di esempi falliti di quello che ho cercato di mantenere le cose concise per i futuri lettori che hanno un problema simile. – dobbs

risposta

2

json_data['scans'] restituisce una lista di dicts, si sta tentando di indicizzare l'elenco utilizzando una str cioè []["id"] che non riesce per ovvi motivi quindi è necessario utilizzare l'indice per ottenere ogni sottoelemento:

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

O per vedere tutto iterate della id sopra l'elenco dei dicts restituito utilizzando json_data["scans"]:

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

per salvare accodare a un elenco:

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

Oppure utilizzare un elenco comp:

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

Se c'è una possibilità la chiave id potrebbero non essere in ogni dict, utilizzare in di controllare prima di accedere a:

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

perfetto! Mi mancava la posizione di indicizzazione della lista dopo ['scansioni']. ha senso ora. Sono un po 'confuso sul secondo esempio però. the: print (d ["id"]) è la posizione dell'indice? ho pensato che dovevi mettere le posizioni dell'indice all'interno delle parentesi per far apparire i valori – dobbs

+0

@dobbs, stiamo ripetendo l'elenco nel ciclo così ogni 'd' è ogni effettivo' elemento/dict 'dalla lista in modo da accedere al dettato dal chiave 'id' per ottenere ogni valore –

0

Ecco come può si itera sugli articoli ed estrai tutti gli ID:

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(); 

Questo approccio funzionerà anche:

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