如何构建嵌套字典?

时间:2017-11-25 09:14:26

标签: python python-3.x dictionary

我有一个字符串列表,我必须从中构建一个字典。所以,例如,我有:

foo.bar:10
foo.hello.world:30
xyz.abc:40
pqr:100

这表示为dict:

{
  "foo": {
    "bar": 10,
    "hello": {
      "world": 30
    }
  },
  "xyz": {
    "abc": 40
  },
  "pqr": 100
}

This question基于相同的前提,但答案讨论了硬编码的深度,例如:

mydict = ...
mydict['foo']['bar'] = 30

由于左边的点分隔字符串可能有任何深度,我无法找到构建字典的方法。我应该如何解析点分隔的字符串并构建字典?

2 个答案:

答案 0 :(得分:1)

逐步建立它有什么问题?

mydict = {}
mydict["foo"] = {}
mydict["foo"]["bar"] = 30
mydict["foo"]["hello"] = {}
mydict["foo"]["hello"]["world"] = 30
mydict["foo"]["xyz"] = {}
mydict["foo"]["xyz"]["abc"] = 40
mydict["foo"]["pqr"] = 100
# ...
pprint.pprint(mydict) # {'foo': {'bar': 30, 'hello': {'world': 30}, 'pqr': 100, 'xyz': {'abc': 40}}}

包括解析,您可以使用以下内容:

import pprint

inp = """foo.bar:10
foo.hello.world:30
xyz.abc:40
pqr:100
"""

mydict = {}

for line in inp.splitlines():
    s, v = line.split(':')
    parts = s.split(".")
    d = mydict
    for i in parts[:-1]:
        if i not in d:
            d[i] = {}
        d = d[i]
    d[parts[-1]] = v

pprint.pprint(mydict) # {'foo': {'bar': '10', 'hello': {'world': 30'}}, 'pqr': '100', 'xyz': {'abc': '40'}}

答案 1 :(得分:1)

在您的情况下要考虑的一个关键点是您要么在父级的dictionarys值部分or中创建一个字典

x = """
foo.bar:10
foo.hello.world:30
xyz.abc:40
pqr.a:100
"""

tree = {}

for item in x.split():
    level, value = item.split(":")[0], item.split(":")[1]

    t = tree
    for part in item.split('.'):
        keyval = part.split(":")
        if len(keyval) > 1:
            #integer
            t = t.setdefault(keyval[0], keyval[1])
        else:
            t = t.setdefault(part, {})


import pprint
pprint.pprint(tree)

<强>结果:

{'foo': {'bar': '10', 'hello': {'world': '30'}},
 'pqr': {'a': '100'},
 'xyz': {'abc': '40'}}