如何将字典的python列表转换为新的dictonary列表?

时间:2013-06-21 18:48:26

标签: python dictionary transform

我有以下词典列表:

list1 = [
            { 'n1': ('e1','e2','e3') },
            { 'n2': ('e1','e2') },
            { 'n3': ('e2','e3','e4') }
        ]

我需要将其转换为:

list2 = [
            { 'e1': ('n1','n2') },
            { 'e2': ('n1','n2','n3') },
            { 'e3': ('n3',) },
            { 'e4': ('n3',) }
         ]

有没有简短而聪明的方法来做到这一点?

2 个答案:

答案 0 :(得分:0)

这样的事情:

>>> from itertools import chain
>>> from collections import defaultdict
>>> vals = set(chain.from_iterable(y for x in list1 for y in x.values()))
>>> dic = defaultdict(list)
>>> for x in vals:
...     for y in list1:
...         for k,v in y.items():
...             if x in v:
...                 dic[x].append(k)
...                 
>>> dic
defaultdict(<type 'list'>,
{'e4': ['n3'],
 'e1': ['n1', 'n2'],
 'e3': ['n1', 'n3'],
 'e2': ['n1', 'n2', 'n3']})

答案 1 :(得分:0)

我认为setdefault在此任务中对您有用。 如果你需要dict作为结果。你可以使用这样的东西。

res = {}
for d in list1: 
    for k, v in d.iteritems():
        for i in v:
            res.setdefault(i, []).append(k)

如果您需要词典列表,可以在此之后使用列表推导

res = [{k:v} for k, v in res.iteritems()]

如果您坚持将列表作为值列表,则将列表转换为最后列表中的元组

res = [{k: tuple(v)} for k, v in res.iteritems()]