使用边缘标签反转字典/有向图

时间:2015-04-16 17:23:13

标签: python dictionary

我想反驳一下这个词典:

{1: {1: '[]', 2: '[1]'}, 2: {1: '[]', 3: '[1]'}, 3: {1: '[]'}}

想象一下,这是一个有顶点1, 2, 3的有向图,标有1 -> 1的边标,标签为'[]',由1: {1: '[]'以字典形式表示。标签不必是字符串,它们只能是列表。

我想要反转边缘并保持标签不变。 我想要的输出是:

{1: {1:'[]', 2:'[]', 3:'[]'}, 2: {1:'[1]'}, 3:{2:'[1]'}}

我看到了一些像Python reverse / invert a mapping这样的方法,但它们都适用于没有"标签的简单字典#34;

1 个答案:

答案 0 :(得分:0)

只需迭代子词典及其中的键,然后将它们添加到新词典中,并将第一个和第二个键反转。

d = {1: {1: '[]', 2: '[1]'}, 2: {1: '[]', 3: '[1]'}, 3: {1: '[]'}}
p = {}
for from_, subdict in d.iteritems():
    for to, value in subdict.iteritems():
        p.setdefault(to, {})
        p[to][from_] = value
print p

或者使用defaultdict,即p = collections.defaultdict(dict),那么您就不需要p.setdefault(to, {})行。

之后,p{1: {1: '[]', 2: '[]', 3: '[]'}, 2: {1: '[1]'}, 3: {2: '[1]'}}