首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建有向多图(Python)

构建有向多图(Python)
EN

Stack Overflow用户
提问于 2015-05-26 15:30:30
回答 1查看 376关注 0票数 1

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

En n=3示例

代码语言:javascript
复制
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 (再多一个,第一个最大),该节点可以对所有节点都有边,再多一个。所以字典应该是这样的:

代码语言:javascript
复制
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嫁给一本字典呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-26 15:54:56

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

代码语言:javascript
复制
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。您可以通过以下方式恢复正常的dict

代码语言:javascript
复制
{k:dict(v) for k,v in d.iteritems()}

这给

代码语言:javascript
复制
{'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}}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30462857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档