迭代并删除python中字典列表中的某些元素

时间:2016-04-07 21:59:22

标签: python list dictionary

我的json文件看起来像这样:

[{'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}]

我正在尝试删除"EventName": "Log"

中的每个事件

我认为有一种方法可以pop出来,但我甚至无法在列表中进行足够多的迭代来完成这项工作。最干净的方法是什么?

我应该得到一个看起来像的列表:

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

3 个答案:

答案 0 :(得分:0)

当您迭代它时,很难修改列表或其他数据结构。创建新的数据结构通常更容易,不包括不需要的值。

您似乎想要做两件事:

  1. "Events" "EventName" "Log"列表中删除词典。
  2. 删除在"Log"事件被删除后,事件列表变空的所有顶级词典。
  3. 一次做这两件事有点棘手,但不是太糟糕:

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

    这比我预期的要容易得多,因为顶级词典(我称之为event_group,因为缺少更好的名称)只有两个键,"Id"和{{1} }。相反,如果这些词典中有许多键和值(或者它们具有哪些键和值是不可预测的),您可能需要用更复杂的东西替换我的代码的最后一行(例如,仅使用过滤的事件创建字典) ,然后使用一种循环来复制所有非"Events"键和值),而不是用文字手工创建字典。

答案 1 :(得分:0)

此计划可能有所帮助。

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)

答案 2 :(得分:-1)

您可以在此

中使用Python生成器/列表编译器

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