访问在字典理解中创建的字典

时间:2011-11-02 23:02:58

标签: python dictionary list-comprehension

我有一个数字字典到数字列表,如:

  

a = {1:[2,3,4],2:[1,4]}

我想创建一个基于它的理解的新词典,其中每个列表中的每个元素都链接到该列表的键。

这就像是:

  

b = {element:[key]用于[key]中元素的a.keys()中的键}

这给了我当然:

  

b = {1:[2],2:[1],3:[1],4:[2]}

而不是

  

b = {1:[2],2:[1],3:[1],4:[1,2]}

因为索引被覆盖了。所以我需要做一些像:

b = { element : [key] + self[element] for key in a.keys() for element in a[key]}

b = { element +: key for key in a.keys() for element in a[key]}

但是以一种有效的方式。

有可能吗?

3 个答案:

答案 0 :(得分:3)

使用defaultdict和两个循环构建字典很容易。

from collections import defaultdict
a = { 1: [2,3,4] , 2: [1,4] }
b = defaultdict(list)
for key, value in a.iteritems():
    for elem in value:
        b[elem].append(key)

答案 1 :(得分:2)

我假设这是用于某种形式的映射:

from itertools import chain
def makeMap(d):
    nodes = set([x for x in chain.from_iterable(d.values())])
    return dict([[x, [y for y in d.keys() if x in d[y]]] for x in nodes ])

此代码将为您执行此操作:)


编辑:

并且继承了(大规模的)一个班轮,我不建议把它放在代码中,因为它是不可读的。

def makeMap(d):
    return dict([[x, [y for y in d.keys() if x in d[y]]]
                 for x in set([x for x in chain.from_iterable(d.values())])
                 ])

步骤:
1.制作一组所有可能的节点值
2.找到字典值中的所有节点值,如果有则将其找到的键放入映射到列表中。

答案 2 :(得分:2)

一切皆有可能:

>>> a = { 1: [2,3,4] , 2: [1,4] }
>>> d={}
>>> for k, v in sum(map(lambda x: zip(x[1], [x[0]]*len(x[1])), a.items()), []):
...   d.setdefault(k, []).append(v)
...
>>> d
{1: [2], 2: [1], 3: [1], 4: [1, 2]}
>>>