[英]Convert a list into a nested dictionary
例如我有
x = ['a','b','c']
我需要將其轉換為:
y['a']['b']['c'] = ''
那可能嗎?
作為背景,我有一個配置文件,其中包含指向某些 json 數據中的位置的點符號。 我想使用點分符號字符串來訪問 json 文件中的特定數據。 例如,在配置中:
path_to_data = "user.name.first_name"
我希望我的腳本將其識別為:
json_data["user"]["name"]["first_name"]
所以我可以得到 first_name 字段的值。 我將原始字符串轉換為列表,現在我不知道如何將其轉換為嵌套字典。
編輯:有一個現有的數據結構,我需要應用 dict 。 比方說:
m = {'a': {'b': {'c': 'lolcat'}}}
以便
m['a']['b']['c']
給我“笑貓”。 如果我得到正確的字典結構(正如一些回復所做的那樣),我仍然需要將它應用於現有的字典'm'。
所以,再次,我從一個配置文件中得到這個:
c = 'a.b.c'
我轉換為列表,認為這會使事情變得更容易:
x = ['a','b','c']
現在我有一個類似 json 的數據結構:
m = {'a': {'b': {'c': 'lolcat'}}}
所以從'x'生成的嵌套字典應該能夠遍歷'm',這樣
m['a']['b']['c']
給我貓。
li = ['a','b','c']
d = reduce(lambda x, y: {y:x}, reversed(li+['']))
print(d)
print(d['a']['b']['c'])
我猜您最后還想包含一個值。 這也適用於:
def get_value(d, l):
if len(l) > 1:
return get_value(d[l[0]], l[1:])
return d[l[0]]
def add_keys(d, l, c=None):
if len(l) > 1:
d[l[0]] = _d = {}
d[l[0]] = d.get(l[0], {})
add_keys(d[l[0]], l[1:], c)
else:
d[l[0]] = c
def main():
d = {}
l1 = ['a', 'b', 'c', 'd']
c1 = 'letters'
l2 = [42, "42", (42,)]
c2 = 42
add_keys(d, l1, c1)
print d
add_keys(d, l2, c2)
print d
if __name__ == '__main__':
main()
它打印:
{'a': {'b': {'c': {'d': 'letters'}}}}
{'a': {'b': {'c': {'d': 'letters'}}}, 42: {'42': {(42,): 42}}}
letters
42
所以它肯定有效。 遞歸取勝。
>>> x = ['a','b','c']
>>> y={}
>>> y[x[-1]]=""
>>> x.pop(-1)
'c'
>>> for i in x[::-1]:
... y={i:y}
...
>>> y
{'a': {'b': {'c': ''}}}
>>> y['a']['b']['c']
''
這將起作用。
#!/usr/bin/python2
from __future__ import print_function
x = ['a','b','c']
def ltod(l):
rv = d = {}
while l:
i = l.pop(0)
d[i] = {}
d = d[i]
return rv
d = ltod(x)
print(d)
print(d["a"]["b"]["c"])
d["a"]["b"]["c"] = "text"
print(d["a"]["b"]["c"])
輸出:
{'a': {'b': {'c': {}}}}
{}
text
在下面找到不是很漂亮但很簡單的示例:
path_to_data = "user.name.first_name"
keys = path_to_data.split('.')
t = []
for key in keys[::-1]: # just to iterate in reversed order
if not t:
t.append({k:{}})
else:
t[-1] = ({k: t[-1]})
#t[0] will contain your dictionary
一般的解決方案是使用collections.defaultdict創建嵌套字典。 然后為您想要的任何行為覆蓋 __setitem__。 這個例子也將進行字符串解析。
from collections import defaultdict
class nesteddict(defaultdict):
def __init__(self):
defaultdict.__init__(self, nesteddict)
def __setitem__(self, key, value):
keys = key.split('.')
for key in keys[:-1]:
self = self[key]
defaultdict.__setitem__(self, keys[-1], value)
nd = nesteddict()
nd['a.b.c'] = 'lolcat'
assert nd['a']['b']['c'] == 'lolcat'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.