2016-04-07 2 views
0

ich Json-Datei, die wie folgt aussieht:Durchlaufen und Löschen bestimmte Elemente in einer Liste der Wörterbücher in Python

[{'Events': [{'EventName': 'Log', 
       'EventType': 'Native', 
       'LogLevel': 'error', 
       'Message': 'missing event: seqNum=1'}, 
      {'EventName': 'Log', 
       'EventType': 'Native', 
       'LogLevel': 'error', 
       'Message': 'missing event: seqNum=2'}], 
    'Id': 116005}, 
{'Events': [{'EventName': 'Log', 
       'EventType': 'Native', 
       'LogLevel': 'error', 
       'Message': 'missing event: seqNum=101'}, 
      {'EventName': 'Log', 
       'EventType': 'Native', 
       'LogLevel': 'error', 
       'Message': 'missing event: seqNum=102'}, 
      {'BrowserInfo': {'name': 'IE ', 'version': '11'}, 
       'EventName': 'Log', 
       'EventType': 'Native', 
       'LogLevel': 'info', 
       'SeqNum': 3, 
       'SiteID': 1454445626890, 
       'Time': 1454445626891, 
       'URL': 'http://test.com'}, 
      {'BrowserInfo': {'name': 'IE ', 'version': '11'}, 
       'EventName': 'eventIndicator', 
       'EventType': 'responseTime', 
       'SeqNum': 8, 
       'SiteID': 1454445626890, 
       'Time': 1454445626923, 
       'URL': 'http://test.com'}], 
    'Id': 116005}] 

Und ich versuche jedes der Ereignisse zu entfernen, wo "EventName": "Log".

Ich würde annehmen, es gibt einen Weg zu pop sie heraus, aber ich kann nicht genug weit genug in die Liste iterieren, um dies zu tun. Was ist der sauberste Weg, dies zu tun?

Ich sollte mit einer Liste am Ende, das wie folgt aussieht:

[{'Events': [{'BrowserInfo': {'name': 'IE ', 'version': '11'}, 
       'EventName': 'eventIndicator', 
       'EventType': 'responseTime', 
       'SeqNum': 8, 
       'SiteID': 1454445626890, 
       'Time': 1454445626923, 
       'URL': 'http://test.com'}], 
    'Id': 116005}] 

Antwort

-1

Sie Generatoren Python verwenden können/Liste comprenhensions für dieses

[x for x in json where x['EventName'] != 'Log']

+1

Dies beantwortet nur einen Teil des Problems, da es mehrere Listen zu filtern gibt, verschachtelt in verschiedenen anderen Objekten. – Blckknght

0

Es ist schwierig, eine Liste oder andere Daten zu ändern Struktur, während Sie darüber iterieren. Es ist oft einfacher, eine neue Datenstruktur zu erstellen, die unerwünschte Werte ausschließt.

Sie scheinen zu wollen, zwei Dinge zu tun:

  1. entfernen Wörterbücher aus den "Events" Listen, die eine "EventName" von "Log" haben.
  2. Entfernen Sie alle Wörterbücher der obersten Ebene, deren Ereignislisten leer sind, nachdem die Ereignisse "Log" entfernt wurden.

Es ist ein bisschen schwierig, beides gleichzeitig zu tun, ich aber auch nicht schlecht:

filtered_json_list = [] 
for event_group in json_list: 
    filtered_events = [event for event in event_group["Events"] 
          if event["EventName"] != "Log"] 
    if filtered_events: # skip empty event groups! 
     filtered_json_list.append({"Id": event_group["Id"], "Events": filtered_events}) 

Dieses viel einfacher war als ich, weil der Top-Level-Wörterbücher erwartet (was ich event_group s nennen, mangels eines besseren Namens) hatte nur zwei Schlüssel, "Id" und "Events". Wenn stattdessen viele Schlüssel und Werte in diesen Wörterbüchern vorhanden wären (oder deren Schlüssel und Werte unvorhersehbar wären), müssten Sie wahrscheinlich die letzte Zeile meines Codes durch etwas komplizierteres ersetzen (z. B. ein Wörterbuch nur mit den gefilterten Ereignissen erstellen) Verwenden Sie dann eine Art Schleife, um alle Schlüssel und Werte zu kopieren, anstatt das Wörterbuch manuell mit einem Literal zu erstellen.

0

Dieses Programm könnte helfen.

import json 

# Parse the JSON 
with open('x.json') as fp: 
    events = json.load(fp) 


# Kill all "Log" events 
for event_set in events: 
    event_list = event_set['Events'] 
    event_list[:] = [event for event in event_list if event['EventName'] != 'Log'] 

# Kill all empty event sets 
events[:] = [event_set for event_set in events if event_set['Events']] 

print json.dumps(events, indent=2) 
+0

Kannst du erklären, was hier passiert? Ich bin schon auf ähnliche Probleme gestoßen, aber ich glaube nicht, dass ich das Konzept verstanden habe. Ich verstehe 'event_list [:] = [Ereignis für Ereignis in event_list wenn Ereignis [' EventName ']! =' Log '] ' – rjbogz

+0

Das funktionierte jedoch wie ein Zauber. Vielen Dank! – rjbogz

Verwandte Themen