构建定向多重图 (Python)
Building a directed multigraph (Python)
假设我得到一个表示相邻节点权重的列表。多重图的形状像一个超立方体。节点将按其坐标命名为二进制字符串。
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_string
和 weights
嫁给一本字典呢?
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
是一个生成器,生成具有 "one more one" 的节点的邻居。它以相反的字典顺序产生它们。
如果顺序不重要,您可以使用普通的 python 字典。您可以通过以下方式恢复正常的 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}}
假设我得到一个表示相邻节点权重的列表。多重图的形状像一个超立方体。节点将按其坐标命名为二进制字符串。
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_string
和 weights
嫁给一本字典呢?
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
是一个生成器,生成具有 "one more one" 的节点的邻居。它以相反的字典顺序产生它们。
如果顺序不重要,您可以使用普通的 python 字典。您可以通过以下方式恢复正常的 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}}