2015-11-16 18 views
5

Ich versuche, eine Liste verschachtelter JSON-Objekte (die von der Twitter-Rest-API über tweepy.api.search zurückgegeben wurden) zu durchlaufen und bestimmte Objekte zu löschen. Ich habe eine Liste mit Objekten, die ich behalten möchte. Ich möchte angeben, welche Wörterbuchobjekte beibehalten und nicht gelöscht werden sollen, da verschiedene Tweets unterschiedliche Schlüssel haben. Sie haben alle einige Schlüssel wie "text", "created_at", etc ... aber es gibt andere Schlüssel, die nur bestimmte Tweets haben.Problem beim Löschen bestimmter verschachtelter JSON-Objekte in Python

Ich laufe auf zwei Probleme.

1) Ich kann nicht ein Wörterbuch Element löschen, während sie durch das Wörterbuch Iterieren

2) Viele der Dictionary-Objekte enthalten verschachtelte Listen und Wörterbücher, die Ich habe Probleme beim Zugriff auf

Ein kleiner Teil der JSON-Datei ich Iterieren durch:

{ 
"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 
} 
] 
} 

Jeder Eintrag in der Liste „Zustände“ ein Tweet ist, und es gibt 100 Tweets pro Anruf zurückgegeben.

Liste der Gegenstände, die ich behalten möchten:

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

Ich versuche zu tun:

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

Ich habe versucht, genau dieses Code und mehr Variationen davon/verschiedene Methoden als ich erinnern, aber es kann nicht funktionieren. Ich habe mir zu diesem Thema zahlreiche Stack-Exchange-Beiträge angesehen, die ich aber nicht für meinen Zweck anpassen konnte.

Ich habe versucht,

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

verwenden, aber ich kann nicht von ihnen machen arbeiten, was ich tun möchte.

Jede Hilfe oder nur ein Stoß in die richtige Richtung würde sehr geschätzt werden.

Antwort

3

Nie Elemente in einer Liste löschen, während über sie iterieren, können Sie entweder

eine Kopie der Liste Make iterieren:

for item in tweetlist[:]: 
    ... 

Speichern Sie die gewünschten Ergebnisse in einer anderen Liste:

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

Wenn Sie ein Diktat herausfiltern möchten, können Sie Folgendes tun:

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

Meine allgemeine Faustregel in Python ist, wenn ich eine Schleife benutze, nach einem anderen Ansatz zu suchen. In diesem Fall wird ein Wörterbuch Verständnis zu verwenden, basierend auf dem ursprünglichen Eintrag:

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

Es wäre denn, die ursprünglichen Daten-Set so groß ist, dass es an Ort und Stelle verarbeitet werden muss, ein Verständnis ist in der Regel schnell und, wenn relativ kurz, Selbstdokumentieren genug, um leicht verstanden zu werden.

+0

Ich glaube 'key: tweet_list [k]' sollte 'key: tweet_list [key]' sein? –

+0

Richtig, das habe ich vermisst, danke. – Greg

Verwandte Themen