Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将键列表转换为嵌套字典_Python_Dictionary - Fatal编程技术网

Python 将键列表转换为嵌套字典

Python 将键列表转换为嵌套字典,python,dictionary,Python,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[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)

只要一个简单的for循环就可以了

>>> d = {}
>>> for k in reversed(keys):
...     d = {k: d}
...     
>>> d
{'key1': {'key2': {'key3': {}}}}
edit:OP在发布后更改了问题)如果您想要列表作为初始值,只需更改第一个赋值:

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

只要一个简单的for循环就可以了

>>> d = {}
>>> for k in reversed(keys):
...     d = {k: d}
...     
>>> d
{'key1': {'key2': {'key3': {}}}}
edit: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': {}}}}

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': {}}}}
您可以使用递归:

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': []}}}
您可以使用递归:

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': []}}}

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

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

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

    if rest:
        value = nest(rest, value)

    return {key: value}

print(nest(keys, []))

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

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

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

    if rest:
        value = nest(rest, value)

    return {key: value}

print(nest(keys, []))

美好的我试着做一种链表类型的迭代来维护指向最近字典的指针,但显然我做不到,我接受这个,我已经修改它来创建我想要的结果。谢谢(*查看我的答案编辑)或者您可以直接执行,而不是
idx
etc
d=[];对于反转中的k(键):d={k:d}
nice!我试着做一种链表类型的迭代来维护指向最近字典的指针,但显然我做不到,我接受这个,我已经修改它来创建我想要的结果。谢谢(*查看我的答案编辑)或者您可以直接执行,而不是
idx
etc
d=[];对于反转中的k(键):d={k:d}
无需使用
枚举
if
。请参阅我的答案中的一行。无需使用
枚举
如果
。请看我的答案,我喜欢你的答案<代码>结果=减少(λx,y:{y:x},反转(键),[])我喜欢你的ans<代码>结果=减少(λx,y:{y:x},反转(键),[])