【问题标题】:Python list to nested keys [closed]嵌套键的Python列表[关闭]
【发布时间】:2014-10-09 04:12:06
【问题描述】:

我正在尝试从列表中创建/填充嵌套字典。

例如,列表[['a','b','c'],value] 可以创建:

data['a']['b']['c'] = value

给我一​​本字典:

{ 'a': { 'b': { 'c' : value } } }

非常感谢所有帮助。

【问题讨论】:

标签: python python-2.7


【解决方案1】:

Python:

l = [['a', 'b', 'c'], 'foo']
d = l[1]
for k in l[0][::-1]:
    d = {k : d}
print d

输出:

{'a': {'b': {'c': 'foo'}}}

【讨论】:

  • 为什么不只是 d = l[1] 然后在循环中 d = {k : d}
  • @jojo 是的,感谢您的简化。
【解决方案2】:

(假设您拥有多个多键/值对。)

您可以使用setdefault 为所有子键添加嵌套字典,除非它们已经存在,每次都继续为除最后一个子键之外的所有子键添加新的字典。然后将值放入最里面的dict中。

def add_nested(d, keys, value):
    for k in keys[:-1]:
        d = d.setdefault(k, {})
    d[keys[-1]] = value

例子:

values = [
    [['a','b','c'], 1],
    [['a','b','d'], 2],
    [['a','e','f'], 3]]

result = {}
for keys, value in values:
    add_nested(result, keys, value)
print(result)

结果:

{'a': {'b': {'c': 1, 'd': 2}, 'e': {'f': 3}}}

或者,您也可以使用旧的infinite dictionary

infinidict = lambda: collections.defaultdict(infinidict)
result = infinidict()
for keys, value in values:
    last = reduce(operator.getitem, keys[:-1], result)
    last[keys[-1]] = value

【讨论】:

  • 这是一个很好的答案。我认为这个问题不应该被打勾为“太宽泛”。
【解决方案3】:

使用生成器和递归样式:

a = [
     [['a','b','c'],1],
     [['c','d'],1],
    ]

def l2d(a):
    def mkd(k,v):
        if not k:
            return v
        return {k[0]:mkd(k[1:],v)}
    for k, v in a:
        yield mkd(k,v)

for d in l2d(a):
    print d

结果:

>>> 
{'a': {'b': {'c': 1}}}
{'c': {'d': 1}}

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多