【问题标题】:Write to dictionary using list-path [duplicate]使用列表路径写入字典 [重复]
【发布时间】:2020-11-09 17:22:45
【问题描述】:

我想用“列表路径”写入字典。我有:

container = {}
path = ['foo', 'bar']
data = [1, 2, 3]

想得到

container = {
    'foo' : {
        'bar' : [1, 2, 3]
    }
}

阅读,我很热心this answer,上面写着阅读

data = functools.reduce(operator.getitem, path, container)

但现在我没有设法得到相反的权利......

(我想可以使用递归,但单行解决方案似乎很近!)

【问题讨论】:

  • @jdaz 谢谢!也许我很天真,但这些答案告诉我如何构建嵌套字典(构建container),但还不知道如何将data 写入它。另外......单线会很好!
  • reduce 的问题是它只适用于接受两个参数的函数,operator.setitem 需要 3 个参数(容器、索引、值)。我再挠挠头……
  • Tom,您可以将该问题中的单行答案更改为仅使用 data 作为 reduce 的初始对象:functools.reduce(lambda x, y: {y: x}, path[::-1], data)
  • 惊人的@jdaz!

标签: python dictionary


【解决方案1】:

这不是单行,但我稍微更改了answer,以便将数据添加到最后一个元素。

path = ['foo','bar']
data = [1,2,3]
container = {}
for key in reversed(path):
    if (key == path[-1]):
        container = {key: data}
    else:
        container = {key: container}

这是输出:{'foo': {'bar': [1, 2, 3]}}

编辑:没关系,我找到了一个基于此answer 的单行符

import functools
path = ['foo','bar']
data = [1,2,3]
container = functools.reduce(lambda x,y:{y:x},path[:-1],{path[-1]: data})

【讨论】:

  • 为了符合问题可以考虑添加container = functools.reduce(...
  • 是的,没错。我马上加进去
  • 不错的改进!
猜你喜欢
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2016-09-20
  • 2021-03-22
  • 2014-06-17
  • 1970-01-01
相关资源
最近更新 更多