从列表中创建字典相同的值

时间:2015-08-27 17:59:15

标签: python list dictionary

如果我有一个包含相同值的列表的字典: a = {'abc': [['aaa', '123'], ['aaa, '321']]}如何将这些值收集到另一个字典中,如下所示:a = {'abc': {'aaa':['123','321']}} 我试过了

aa = {'abc': [['aaa', '123'], ['aaa', '321']]}

ab = {}
bb = []
for i in aa:
    for elem in aa[i]:
        path = elem[0]
        name = elem[1]
        bb.append(name)

ab[path] = []
ab[path] = (bb)

print ab

但我不认为这是对的。

2 个答案:

答案 0 :(得分:3)

您可以尝试这样:

def to_nested_dict(list_dict):
    d = {}                                   # initialize the outer dict
    for k, lst in list_dict.items():
        d[k] = {}                            # initialize inner dicts
        for x, y in lst:
            d[k].setdefault(x, []).append(y) # initialize and populate innermost list
    return d

如果是新密钥,则使用setdefault提供defalt值(空列表),但您也可以使用if - 语句或collections.defaultdict(list)

示例:

>>> to_nested_dict({'abc': [['aaa', '123'], ['aaa', '321']]})
{'abc': {'aaa': ['123', '321']}}
>>> to_nested_dict({'abc': [['aaa', '123'], ['aaa', '321'], ['bbb', '456']]})
{'abc': {'aaa': ['123', '321'], 'bbb': ['456']}}
>>> to_nested_dict({'abc': [['aaa', '123'], ['aaa', '321'], ['bbb', '456']], 'efg': [['eee', '789']]})
{'abc': {'aaa': ['123', '321'], 'bbb': ['456']}, 'efg': {'eee': ['789']}}

这并不是假设最里面的列表总是有两个元素,一个键和一个值,并且键在不同的列表中可以是相同的,但也可以不同,从而导致多个条目创建词典。

答案 1 :(得分:2)

以下是适合您的单行解决方案:

ab  = { k:{v[0][0]:[ x[1] for x in v ] } for k,v in aa.iteritems() }

输出:

print ab
{'abc': {'aaa': ['123', '321']}}