首页 > 解决方案 > Python使用N个字典中具有相同条目但值不同的值列表制作主字典

问题描述

我有一台服务器每秒吐出五次状态更新。经过一些操作,我的程序创建了一个包含大约 3000 个条目的 JSON 字典。这是每 200 毫秒接收一次,因此 JSON 在其条目方面完全相同,但值会发生变化。我需要测试一些输入并准确查看哪些条目发生了变化,持续了多长时间等。这是我得到的 JSON dict 结构的示例:

 {
  "start-flag": 123456789,
  "packet_length": 3012,
  "id": 1253,
  "Subsystem_1": {
    "mode": 4,
    "is_active": 0,
    ...
    "voltage-on": 1},
  "Subsystem_2": {
    "local_temp": 25,
    "temp_error": 0,
    ...
    "collective_status_error": 0},
  ...
  "irbh_system_status": 0,
  "end-flag": 987654321}

你明白了。但是值经常变化,我想以某种方式记录一段时间内收到的所有字典,并制作一个看起来像这样的主:

 {
  "start-flag": [123456789, 123456789, 123456789, 123456789]
  "packet_length": [3012, 3012, 3012, 3012]
  "id": [1253, 1442, 2345, 2355]
  "Subsystem_1": {
    "mode": [4, 1, 1, 4]
    "is_active": [0, 1, 1, 0]
    ...
    "voltage-on": [1, 2.4, 2.4, 1]},
  "Subsystem_2": {
    "local_temp": [25, 28, 35, 100],
    "temp_error": [0, 0, 0, 1],
    ...
    "collective_status_error": [0, 0, 0, 1]},
  ...
  "irbh_system_status": [0, 0, 0, 0],
  "end-flag": [987654321, 987654321, 987654321, 987654321]}

这将是 4 个不同的 JSON dicts 加在一起形成一个 master。条目是相同的,但值会随着时间而变化,我想看看它们。我可能需要大约 600 个字典,因为我经常收到它们,并且需要 2 分钟的样本(或更多)。

运行时制作这个主命令的最佳方法是什么?即一个函数,它在调用时接受一个字典,如果它是第一个使其成为主字典,但如果它不是第一个,则只需将所有条目的所有值(包括嵌套字典的值)添加到主字典,并使主列表中的所有值?接收到的字典条目的值始终是 int 或 float。

编辑:我忘了包括这个,因为我刚刚发现这个错误试图自己解决这个问题。一些嵌套字典具有相同的条目名称。在上面的示例中,可以使用具有“mode”和“is_active”条目的 Subsystem_1 和 Subsystem_2 来显示,我只是忘记包含这样一个字段。这是两个不同子系统的两个不同条目(因此它们位于不同的嵌套字典中),但在它们各自的字典中具有相同的条目名称。遗憾的是,我无法编辑这些名称,因为它是从我只能读取的黑匣子计算机发送的。

如果我添加 Leniks 的解决方案

d = my_stream_json_dict

# all the names of the first level nested dicts,
# assuming no second level nested dicts exist.
headers = ['Subsystem_1', 'Subsystem_2', ....]
for a in headers:
    for k,v in d[a].items() :
        master[k].append(v)

但不考虑具有相同条目名称的多个嵌套字典(因为我没有提到它,我的错!),如果相同的条目存在于多个嵌套字典中,它会被填充多次。

如果修改后的解决方案仅使用一个字典运行一次,则不考虑顶级条目(老实说,这对我来说不是问题,因为只有嵌套字典(子系统)很重要),但是尽管每个条目都应该有只提供了一个值,因为只提供了 1 个字典,在 N 个嵌套字典中共享相同名称的条目在每个嵌套字典条目中都有 N 个值

标签: pythonjsondictionary

解决方案


尝试这个:

from collections import defaultdict

master = defaultdict(list)
for d in received_dictionaries :  # this is your data from the web
    for k,v in d.items() :
        master[k].append(v)

推荐阅读