我有一个数字字典到数字列表,如:
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]}
但是以一种有效的方式。
有可能吗?
答案 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]}
>>>