簡體   English   中英

將列表轉換為嵌套字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM