构建有向多图(Python)

时间:2015-05-26 15:30:30

标签: python dictionary graph hypercube

假设我得到一个表示相邻节点权重的列表。多图形的形状像超立方体。节点将按其坐标命名为二进制字符串。

n=3

的示例
bin_string = ['000', '100', '010', '001', '110', '101', '011', '111']
weights = [[-5, -13, -2], [16, -9], [-15, 2], [13, -13], [18], [-9], [18]]

我想通过以下方式从两个列表构建一个字典:我们从000开始,并且在所有节点上都有一个边缘,其中一个节点有一个反向词典顺序(如bin_string中所示)。第二个节点将是100(一个多1个,最大的一个),并且该节点可以具有到所有节点的边缘,再一个节点1个。所以字典看起来像这样:

d = { '000':{'100':-5, '010':-13, '001':-2},
      '100':{'110':16, '101':-9},
      '010':{'110':-15, '011':2},
      '001':{'101':13, '011':-13},
      '110':{'111':18},
      '101':{'111':-9},
      '011':{'111':18}
     }

我有各种尺寸的超立方体,并且已经可以生成bin_string,具体取决于尺寸。但是,如何将bin_stringweights结合到一个词典?

1 个答案:

答案 0 :(得分:2)

Python词典没有已定义的顺序,因此您需要使用collections.OrderedDict。这是一个例子:

from collections import OrderedDict

def one_more_one(s):
    for i, digit in enumerate(s):
        if digit == '0':
            yield s[:i] + '1' + s[i+1:]

bin_string = ['000', '100', '010', '001', '110', '101', '011', '111']
weights = [[-5, -13, -2], [16, -9], [-15, 2], [13, -13], [18], [-9], [18]]

d = OrderedDict()
for node, weight in zip(bin_string, weights):
    d[node] = OrderedDict(zip(one_more_one(node), weight))

这里,one_more_one是一个生成器,它产生一个节点的邻居,它们具有“一个多一个”。它以反向字典顺序产生它们。

如果订单不重要,您可以使用普通的python dicts。您可以通过以下方式恢复正常dict

{k:dict(v) for k,v in d.iteritems()}

给出了

{'000': {'001': -2, '010': -13, '100': -5},
 '001': {'011': -13, '101': 13},
 '010': {'011': 2, '110': -15},
 '011': {'111': 18},
 '100': {'101': -9, '110': 16},
 '101': {'111': -9},
 '110': {'111': 18}}