将多个词典作为值插入到单个键中

时间:2015-09-26 00:12:15

标签: python dictionary nested

我需要{a:{} {b:{},{c:{}}}}形式的一组嵌套词典,其中a,b和c是键。我试过以下代码。

from collections import defaultdict
def dictizeString(string,dictionary) :
    while string.startswith('/'):
        string = string[1:]
    parts = string.split('/',1)

    if len(parts)>1:
        branch = dictionary.setdefault(parts[0],[dict()])
        dictionary[parts[0]].append(dict())
        dictizeString(parts[1], branch)
    else:
        if dictionary.has_key(parts[0]):
            dictionary[parts[0]]=dict()
        else:
            dictionary[parts[0]]=[dict()]
            dictionary[parts[0]].append(dict())               


d={}

dictizeString('/a/b/c/d', d)
print d

执行此代码会导致错误''list'对象没有属性'setdefault''。该代码适用于第一次迭代(即a),但在第二次迭代时抛出上述错误(即b)。

追加功能适用于代码的最后6行中的else部分。我试图在if情况下使用相同的逻辑,但它会抛出错误。

2 个答案:

答案 0 :(得分:0)

尝试:

from collections import defaultdict
def dictizeString(string,dictionary) :
    while string.startswith('/'):
        string = string[1:]
    parts = string.split('/',1)

    if len(parts)>1:
        branch = dictionary.setdefault(parts[0],[dict()])
        dictionary[parts[0]].append(dict())
        dictizeString(parts[1], branch[1]) # <--- branch -> branch[1]
    else:
        if dictionary.has_key(parts[0]):
            dictionary[parts[0]]=dict()
        else:
            dictionary[parts[0]]=[dict()]
            dictionary[parts[0]].append(dict())               


d={}

dictizeString('/a/b/c/d', d)
print d

第7行的内容是将默认设置为字典的列表的语句,但是您会尝试使用预期字典的函数。

答案 1 :(得分:0)

我知道你找到了答案,但你也可以这样做:

def dictizeString(path, dictionary):
    keys = path.lstrip('/').split('/')
    current_key = None
    for key in keys:
        if current_key is None:
            current_key = dictionary.setdefault(key, {})
        else:
            current_key = current_key.setdefault(key, {})

d = {}
dictizeString('/a/b/c/d', d)
print d

输出变为:{'a': {'b': {'c': {'d': {}}}}}