用字符串列表构建嵌套的dictionnary

2024-10-17 06:22:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要建立一个基于配置文件的嵌套字典。你知道吗

我有:

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的块

“XXX}”=>;关闭名为XXX的群

如果没有“{”或“}”=>;则为块的值。你知道吗

我需要这个:

{'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)

我想,它错过了一件事:伊莱夫检索(r'}$',行) 但我不知道是什么。你知道吗

你能帮我吗?:)


Tags: gtrelinecurrentdictxxxpprintvalue1
2条回答

可以使用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': ''}}

您没有跟踪dict的历史记录。我添加了上一个dict,并在存在'}'时将dict还原为上一个值。请在下面找到解决方案。希望有帮助。你知道吗

import re
import pprint

def get_data() : 
    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("}")   
    return a


def get_dict(input_chain):
    dict_test = {}
    current_dict = dict_test
    previous_dict = dict_test #this was missing
    for line in input_chain:
        line = line.strip()
        if re.search(r"{$", line):
            previous_dict = current_dict
            current_dict[line] = {}
            current_dict = current_dict[line]
        elif re.search(r'}$', line):
            current_dict = previous_dict #revert to last dict at the end of the block
        else:
            current_dict[line] = ""

    return dict_test


def main():
    a = get_data()
    b = get_dict(a)
    pprint.pprint(b)


if __name__ == '__main__':
    main()

输出

{'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': ''}}

相关问题 更多 >