首页 > 解决方案 > 带有给定变量的 Python Dict 附加列表

问题描述

我尝试使用带有附加列表的 dict 构造数据,我尝试使用defaultdict但给出错误。

data = 
"""
[{'transit01_net': '192.168.1.0',
  'transit01_subnet': '26',
  'transit02_net': '192.168.2.0',
  'transit02_subnet': '26',
  'transit03_net': '192.168.3.0',
  'transit03_subnet': '26',
}]
"""
output = {
  'transit01': [],
  'transit02': [],
  'transit03': []
}

我想得到:

{
'transit01': ['192.168.1.0', '26', 'Transit01'],
'transit02': ['192.168.2.0', '26', 'Transit02'],
'transit03': ['192.168.3.0', '26', 'Transit03'],
}

我试过跟随,但只能打印第一个

for item in data:

      # Iterating the elements in list
      output['transit01'].append(item['transit01_net'])
      output['transit01'].append(item['transit01_subnet'])
      output['transit01'].append('Transit01')

      output['transit02'].append(item['transit02_net'])
      output['transit02'].append(item['transit02_subnet'])
      output['transit02'].append('Transit02')

      output['transit03'].append(item['transit03_net'])
      output['transit03'].append(item['transit03_subnet'])
      output['transit03'].append('Transit03')

标签: pythondictionary

解决方案


逐步完成。你想从中得到:

data = 
"""
[{'transit01_net': '192.168.1.0',
  'transit01_subnet': '26',
  'transit02_net': '192.168.2.0',
  'transit02_subnet': '26',
  'transit03_net': '192.168.3.0',
  'transit03_subnet': '26',
}]
"""

对此

{
'transit01': ['192.168.1.0', '26', 'Transit01'],
'transit02': ['192.168.2.0', '26', 'Transit02'],
'transit03': ['192.168.3.0', '26', 'Transit03'],
}

前者是描述文字数据结构的字符串。Python 使您可以访问astlex 并将其标记为您的 Python 对象。

import ast
evald_data = ast.literal_eval(data)

从那里你需要做更困难的工作来实际解析结构。不过,看起来您可以拆分每个键并获得所需的内容。现在让我们保存每个字段的名称。

result = {}
for d in evald_data:  # for each dictionary in the (single-item) list
    for k, v in d.items():
        name, key = k.split("_")
        result.setdefault(name, {})[key] = v

# this should give you
expected = {
    {'transit01': {'net': '192.168.1.0', 'subnet': '26'},
    {'transit02': {'net': '192.168.2.0', 'subnet': '26'},
    {'transit03': {'net': '192.168.3.0', 'subnet': '26'}
}
assert result == expected

从那里它是非常简单的东西。我假设您可能想要一个元组而不是列表,因为这些值的顺序似乎很重要(对它们进行排序不仅不好,而且不正确)。

final_result = {k: (v['net'], v['subnet'], k.title()) for k,v in result.items()}
expected = {
    'transit01': ['192.168.1.0', '26', 'Transit01'],
    'transit02': ['192.168.2.0', '26', 'Transit02'],
    'transit03': ['192.168.3.0', '26', 'Transit03'],
}
assert final_result == expected

推荐阅读