繁体   English   中英

将键列表转换为嵌套字典

[英]convert list of keys to nested dictionary

我试图弄清楚如何创建一个像这样的字典: d[keys[0]][keys[1]][keys[2]]从这样的列表中: keys = ["key1", "key2", "key3"] ...

我尝试了以下方法:

  keys = ["key1", "key2", "key3"]
  d = {}
  d_ref= d
  for key_num, key in enumerate(keys):
    if key_num < len(keys)-1:
      d[key] = {}
      d_ref = d[key]
    else:
      d_ref[key] = []
  print(d)

但这导致:

{'key1': {}, 'key2': {'key3': []}}

我的目标是输出:

{'key1' : { 'key2' : { "key3" : [] } } }

更新资料

感谢wim的回答,使我获得了理想的结果:

keys = ["key1", "key2", "key3"]
d = []
for key in reversed(keys):
   d = {key: d}

print(d)

只需简单的for循环即可解决问题

>>> d = {}
>>> for k in reversed(keys):
...     d = {k: d}
...     
>>> d
{'key1': {'key2': {'key3': {}}}}

编辑 OP在发布后更改了问题 )如果要将列表作为初始值,只需更改第一个任务:

>>> d = []
>>> for k in reversed(keys):
...     d = {k: d}
...     
>>> d
{'key1': {'key2': {'key3': []}}}

在OP进行编辑后,解决方案现在变成了一种形式:

result = reduce(lambda obj, key: {key: obj}, reversed(keys), [])
# {'key1': {'key2': {'key3': []}}}

或使用一些函数式编程:

from functools import reduce
keys = ["key1", "key2", "key3"]
result = reduce((lambda obj, key: {key: obj}), reversed(keys), dict())
print(result)
# {'key1': {'key2': {'key3': {}}}}

我同意@ Ajax1234的观点,这个问题具有递归的味道,但是我认为可以用比他的解决方案简单得多的代码来完成:

keys = ["key1", "key2", "key3"]

def nest(keys, value):
    key, *rest = keys

    if rest:
        value = nest(rest, value)

    return {key: value}

print(nest(keys, []))

您可以使用递归:

def get_dictionary(s, d):
   if not s[1:]:
      return {s[0]:d}
   else:
      if not d:
          return get_dictionary(s[1:], {s[0]:[]})
      else:
          return get_dictionary(s[1:], {s[0]:d})


print(get_dictionary(["key1", "key2", "key3"][::-1], {}))

输出:

{'key1': {'key2': {'key3': []}}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM