我试图弄清楚如何创建一个如下所示的字典: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)
答案 0 :(得分:7)
只需一个简单的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': []}}}
答案 1 :(得分:3)
在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': {}}}}
答案 2 :(得分:1)
我同意@ Ajax1234这个问题有一个递归的味道,但我认为它可以做比他的解决方案更简单的代码:
keys = ["key1", "key2", "key3"]
def nest(keys, value):
key, *rest = keys
if rest:
value = nest(rest, value)
return {key: value}
print(nest(keys, []))
答案 3 :(得分:0)
您可以使用递归:
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': []}}}