2015-11-16 11 views
5

Sto tentando di eseguire l'iterazione attraverso un elenco di oggetti JSON nidificati (restituiti dall'API twitter rest tramite tweepy.api.search) ed eliminare determinati oggetti. Ho una lista di oggetti da conservare. Desidero specificare quali oggetti del dizionario conservare e quali eliminare perché i diversi tweet hanno chiavi diverse. Tutti hanno alcune chiavi come "text", "created_at", ecc ... ma ci sono altre chiavi che solo alcuni tweet hanno.Problemi nell'eliminazione di determinati oggetti JSON nidificati in python

Sto riscontrando due problemi.

1) Non posso cancellare una voce del dizionario, mentre scorrendo il dizionario

2) Molti degli oggetti del dizionario contiene liste nidificate e dizionari che io sto avendo problemi ad accedere

Una piccola porzione del file JSON sto scorrendo:

{ 
"statuses": [ 
    { 
     "contributors": null, 
     "coordinates": null, 
     "created_at": "Thu Nov 12 01:28:07 +0000 2015", 
     "entities": { 
      "hashtags": [], 
      "symbols": [], 
      "urls": [ 
       { 
        "display_url": "twitter.com/thehill/status\u2026", 
        "expanded_url": "https://twitter.com/thehill/status/664581138975989761", 
        "indices": [ 
         139, 
         140 
        ], 
        "url": "https://t.co/9zfkg2FixZ" 
       } 
      ], 
      "user_mentions": [ 
       { 
        "id": 2517854953, 
        "id_str": "2517854953", 
        "indices": [ 
         3, 
         19 
        ], 
        "name": "It'sAlwaysPolitical", 
        "screen_name": "politicspodcast" 
       } 
      ] 
     }, 
     "favorite_count": 0, 
     "favorited": false, 
     "geo": null 
} 
] 
} 

Ogni elemento nella lista "status" è un tweet, e ci sono 100 tweets restituiti per ogni chiamata.

elenco di elementi che voglio mantenere:

keepers_list = [tweetlist["statuses"][i]["coordinates"], 
       tweetlist["statuses"][i]["created_at"], 
       tweetlist["statuses"][i]["entities"]["urls"] 
       ] 

che sto cercando di fare:

for item in tweetlist: 
    if item not in keepers_list: 
     del item 

Ho provato questo codice esatto e più varianti su di esso metodi/diverse di quanto io possa ricorda, ma non può farlo funzionare. Ho esaminato numerosi post di scambio di stack su questo argomento, ma non sono stato in grado di adattare nessuno di loro al mio scopo.

Ho provato con

for key in dict.iterkeys(): ... 
for value in dict.itervalues(): ... 
for key, value in dict.iteritems(): 

ma non riesco a fare qualsiasi di loro lavorano per quello che voglio fare.

Qualsiasi aiuto, o solo una spinta nella giusta direzione, sarebbe molto apprezzato.

risposta

3

Mai eliminare elementi in una lista, mentre l'iterazione su di esso, è possibile

Fare una copia della lista per iterare su:

for item in tweetlist[:]: 
    ... 

Salvare i risultati desiderati in un altro elenco:

keep = [] 
for item in tweetlist: 
    if item in keepers_list: 
     keep.append(item) 
2

Se si desidera filtrare un dict si può fare qualcosa di simile:

for k in dict.keys(): 
    if k not in keepers_list: 
     del(dict[k]) 
print dict 
3

La mia regola generale in Python è, se mi trovo a utilizzare un ciclo, per cercare un approccio diverso. In questo caso, per usare una comprensione dizionario, in base alla voce originale:

keep = {key:tweet_list[key] for key in tweet_list.keys() if key in keepers_list} 

A meno che l'insieme di dati originale è così grande che deve essere elaborato in luogo, la comprensione è generalmente veloce e, se relativamente breve, autodidatta quanto basta per essere facilmente comprensibile.

+0

Credo che "chiave: tweet_list [k]' dovrebbe essere 'chiave: tweet_list [chiave]'? –

+0

Esatto, l'ho perso, grazie. – Greg

Problemi correlati