如何拆分字典内列表中的字典并单独处理其中的值?
问题描述
我清楚自己需要掌握字典(Dictionary)和列表推导式(List Comprehension)的相关知识。我在Stack Overflow等平台查了很多文章,但越看越懵,希望有人能帮忙。
当我查询数据库时,会得到一个<class 'dict'>类型的对象,格式是{'results': [ {x1:1, y1:2, z1:3}, {...}, {...} ]},示例如下:
{'results': [{'Event Time': '2023-01-25T00:18:32.3900000', 'AccountID': 'MICROSOFT\\Norma.Cayshun', 'AuditEventMessage': 'User MICROSOFT\\Norma.Cayshun has changed alert note SOUTHBAY-VM2 13.107.136.45 has rebooted. [].'}, {'Event Time': '2023-01-25T00:18:32.3900000', 'AccountID': 'MICROSOFT\\Norma.Cayshun', 'AuditEventMessage': 'User MICROSOFT\\Norma.Cayshun acknowledged alert SOUTHBAY-VM2 13.107.136.45 has rebooted..'}, {'Event Time': '2023-01-16T01:55:05.1930000', 'AccountID': 'MICROSOFT\\Christopher.Cheef', 'AuditEventMessage': 'User MICROSOFT\\Christopher.Cheef has changed alert note Server Node Down on NORTHLOBBY-VM5 [].'}, {'Event Time': '2023-01-16T01:55:05.1930000', 'AccountID': 'MICROSOFT\\Christopher.Cheef', 'AuditEventMessage': 'User MICROSOFT\\Christopher.Cheef acknowledged alert Server Node Down on NORTHLOBBY-VM5.'}, {'Event Time': '2023-01-16T01:55:05.1930000', 'AccountID': 'MICROSOFT\\Christopher.Cheef', 'AuditEventMessage': 'User MICROSOFT\\Christopher.Cheef has changed alert note SOUTHBAY-VM2 13.107.136.45 has rebooted. [].'}]}
我希望把这些字典里的值单独提取出来,格式化打印或者按需处理,比如:
1. 'Event Time': '2023-01-25T00:18:32.3900000', 'AccountID': 'MICROSOFT\\Norma.Cayshun', 'AuditEventMessage': 'User MICROSOFT\\Norma.Cayshun has changed alert note SOUTHBAY-VM2 13.107.136.45 has rebooted. [].' 2. 'Event Time': '2023-01-25T00:18:32.3900000', 'AccountID': 'MICROSOFT\\Norma.Cayshun', 'AuditEventMessage': 'User MICROSOFT\\Norma.Cayshun acknowledged alert SOUTHBAY-VM2 13.107.136.45 has rebooted..' 3. 'Event Time': '2023-01-16T01:55:05.1930000', 'AccountID': 'MICROSOFT\\Christopher.Cheef', 'AuditEventMessage': 'User MICROSOFT\\Christopher.Cheef has changed alert note Server Node Down on NORTHLOBBY-VM5 [].'
有人推荐用Pandas/Numpy、Zip()、Lambda()这些方法,但我想要更简单的方案,这样能更好理解问题。以下是我正在测试的代码:
def query_database(): result = {'results': [{'Event Time': '2023-01-25T00:18:32.3900000', 'AccountID': 'MICROSOFT\\Norma.Cayshun', 'AuditEventMessage': 'User MICROSOFT\\Norma.Cayshun has changed alert note SOUTHBAY-VM2 13.107.136.45 has rebooted. [].'}, {'Event Time': '2023-01-25T00:18:32.3900000', 'AccountID': 'MICROSOFT\\Norma.Cayshun', 'AuditEventMessage': 'User MICROSOFT\\Norma.Cayshun acknowledged alert SOUTHBAY-VM2 13.107.136.45 has rebooted..'}, {'Event Time': '2023-01-16T01:55:05.1930000', 'AccountID': 'MICROSOFT\\Christopher.Cheef', 'AuditEventMessage': 'User MICROSOFT\\Christopher.Cheef has changed alert note Server Node Down on NORTHLOBBY-VM5 [].'}, {'Event Time': '2023-01-16T01:55:05.1930000', 'AccountID': 'MICROSOFT\\Christopher.Cheef', 'AuditEventMessage': 'User MICROSOFT\\christopher.Cheef acknowledged alert Server Node Down on NORTHLOBBY-VM5.'}, {'Event Time': '2023-01-16T01:55:05.1930000', 'AccountID': 'MICROSOFT\\Christopher.Cheef', 'AuditEventMessage': 'User MICROSOFT\\Christopher.Cheef has changed alert note SOUTHBAY-VM2 13.107.136.45 has rebooted. [].'}]} return result def display_data(): result = query_database() print("{0}".format(result)) for item in result: print(item) print(f">>> {result.values()}") def main(): display_data() if __name__ == '__main__': main()
简单解决方案
你的核心问题是没正确访问到嵌套在字典里的列表。外层字典只有一个键'results',对应的值是你需要处理的字典列表。我们可以用基础的循环来实现需求:
修改display_data函数如下:
def display_data(): result = query_database() # 获取results对应的列表 events = result['results'] # 遍历列表,用enumerate获取索引(从1开始)和每个事件字典 for idx, event in enumerate(events, start=1): # 把字典转换成符合要求的字符串格式 event_str = ", ".join([f"'{k}': '{v}'" for k, v in event.items()]) # 打印带编号的结果 print(f"{idx}. {event_str}\n")
代码解释
result['results']:直接取出外层字典里的列表,这是你要处理的核心数据。enumerate(events, start=1):遍历列表时同时获取从1开始的编号,正好对应你想要的1、2、3...格式。", ".join([f"'{k}': '{v}'" for k, v in event.items()]):把每个事件字典的键值对转换成指定的字符串格式,再用逗号连接起来。- 最后用
print(f"{idx}. {event_str}\n")输出带编号的结果,每个条目后换行分开。
这样修改后,运行代码就能得到你想要的格式化输出,而且都是基础的字典和列表操作,容易理解。
内容的提问来源于stack exchange,提问作者AliasSyed
相关产品推荐
相关产品推荐

