python - 使用字符串列表构建嵌套字典

标签 python nested

我需要基于配置文件构建一个嵌套字典。

我有:

Chain1 {
    Chain1_value1
    Chain1_Chain2 {
    Chain1_Chain2_value1
        Chain1_Chain2_Chain3 {
            Chain1_Chain2_Chain3_value1
            Chain1_Chain2_Chain3_value2
            Chain1_Chain2_Chain3_value3
        }
        Chain1_Chain2_Chain4 {
            Chain1_Chain2_Chain4_value1
            Chain1_Chain2_Chain4_value2
            Chain1_Chain2_Chain4_value3
        }
    }
}

"XXX {"=> 打开一个名为 XXX 的 block

"XXX }"=> 关闭一个名为 XXX 的区 block

如果没有 "{"或 "}"=> 它是 block 的值。

我需要这个:

{'Chain1 {': {'Chain1_Chain2 {': {'Chain1_Chain2_Chain3 {': {'Chain1_Chain2_Chain3_value1': '',
                                                             'Chain1_Chain2_Chain3_value2': '',
                                                             'Chain1_Chain2_Chain3_value3': '',}}
                                  'Chain1_Chain2_Chain4 {': {'Chain1_Chain2_Chain4_value1': '',
                                                            'Chain1_Chain2_Chain4_value2': '',
                                                            'Chain1_Chain2_Chain4_value3': ''}},
                                  'Chain1_Chain2_value1': ''},
              'Chain1_value1': ''}}

但目前我有这个:

{'Chain1 {': {'Chain1_Chain2 {': {'Chain1_Chain2_Chain3 {': {'Chain1_Chain2_Chain3_value1': '',
                                                             'Chain1_Chain2_Chain3_value2': '',
                                                             'Chain1_Chain2_Chain3_value3': '',
                                                             'Chain1_Chain2_Chain4 {': {'Chain1_Chain2_Chain4_value1': '',
                                                                                        'Chain1_Chain2_Chain4_value2': '',
                                                                                        'Chain1_Chain2_Chain4_value3': ''}},
                                  'Chain1_Chain2_value1': ''},
              'Chain1_value1': ''}}

我的代码:

import re
import pprint

a = []
a.append("Chain1 {")
a.append("    Chain1_value1")
a.append("    Chain1_Chain2 {")
a.append("    Chain1_Chain2_value1")
a.append("        Chain1_Chain2_Chain3 {")
a.append("            Chain1_Chain2_Chain3_value1")
a.append("            Chain1_Chain2_Chain3_value2")
a.append("            Chain1_Chain2_Chain3_value3")
a.append("        }")
a.append("        Chain1_Chain2_Chain4 {")
a.append("            Chain1_Chain2_Chain4_value1")
a.append("            Chain1_Chain2_Chain4_value2")
a.append("            Chain1_Chain2_Chain4_value3")
a.append("        }")
a.append("    }")
a.append("}")

for l in a:
    print l
dict_test = {}
current_dict = dict_test
for line in a:
    line = line.strip()
    if re.search(r"{$", line):
        current_dict[line] = {}
        current_dict = current_dict[line]
    elif re.search(r'}$', line):
        pass
    else:
        current_dict[line] = ""
pprint.pprint(dict_test)

我想,它在这里遗漏了一些东西:elif re.search(r'}$', line) 但我不知道是什么。

你能帮帮我吗? :)

最佳答案

您可以使用parse 方法创建一个类:

import re
new_s = iter([re.sub('^\s+', '', i) for i in filter(None, 
s.split('\n'))])
from collections import defaultdict
class DictObject:
  def __init__(self, d):
    self.d = d
    self.current_dict = {}
    self.parse()
  def parse(self):
    while True:
      current = next(self.d, None)
      if not current:
        break
      if current.endswith('{'):
        second_piece = DictObject(self.d)
        self.current_dict[current] = second_piece.current_dict
        self.d = second_piece.d
      elif current == '}':
        break
      else:
        self.current_dict[current] = ''
        print(self.current_dict)


c = DictObject(new_s)
print(c.current_dict)

输出:

{'Chain1 {': {'Chain1_Chain2 {': {'Chain1_Chain2_Chain3 {': {'Chain1_Chain2_Chain3_value1': '',
                                                         'Chain1_Chain2_Chain3_value2': '',
                                                         'Chain1_Chain2_Chain3_value3': ''},
                              'Chain1_Chain2_Chain4 {': {'Chain1_Chain2_Chain4_value1': '',
                                                         'Chain1_Chain2_Chain4_value2': '',
                                                         'Chain1_Chain2_Chain4_value3': ''},
                              'Chain1_Chain2_value1': ''},
          'Chain1_value1': ''}}

关于python - 使用字符串列表构建嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49389569/

相关文章:

Python 测试我的数据是否服从对数正态分布

python - django 更改默认运行服务器端口

python - 按值分组列表

c++ - C++ 与 Python 之间的通信 (IPC)

arrays - 在 PostgreSQL 中使用类似 JOIN 的语句合并嵌套的 JSONB 字段数组?

嵌套 css 定义中的 css overclassing

c# - StackOverflowException 对嵌套数据使用 Linq(Kit)

python - 将 mlflow 作为 systemd 服务运行 - 找不到gunicorn

arrays - MongoDB:将嵌套数组中的值分组以获取计数

mysql - 如何在 mysql 上按 ID 分组并仅计算 5 的值?