访问在字典推导式中创建的字典

4
我有一个将数字字典化为数字列表的字典,如下所示:
a = {1: [2,3,4], 2: [1,4]}
我想要创建一个新的字典,并根据原始字典中的每个列表中的每个元素将其链接到该列表的键。
这应该像是下面这样:
b = { element : [key] for key in a.keys() for element in a[key]}
这给了我:
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个回答

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)

感谢您的时间,我不知道defaultdict,但这个真正的目的是看看我是否可以使用列表推导来实现它。 - user246100
我明白。一行代码很聪明,但在生产中,我更喜欢不需要花费5分钟才能解密的代码! - Alasdair
是的,当然可以,但我正在学习这门语言,这让我更快地融入其中。 - user246100

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. 查找字典值中的所有节点值,如果存在,则将其对应的键放入映射列表中。


我想知道是否可能只用一行代码实现,但你的方法在精神上是正确的,虽然它没有做对:{1: [2, 3],2: [1, 3],3: [1, 2],4: [1]}。 - user246100
@user,你输入正确吗?这段代码在我的端上运行良好,我也会为你将它改成一行代码。 - Serdalis
没关系,可能是我的问题。非常感谢您将其变成一行。 - user246100

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]}
>>>

我是Python的新手,现在甚至都看不懂那个,但非常感谢,这会让我学到很多东西。 - user246100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接