1

隣接するノードへの重みを表す 1 つのリストを取得するとします。マルチグラフはハイパーキューブのような形をしています。ノードは、座標によってバイナリ文字列として名前が付けられます。

の例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)。2 番目のノードは100(もう 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 つの辞書と結婚するのでしょうか?

4

1 に答える 1

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は、「もう 1 つ」あるノードの隣接ノードを生成するジェネレータです。逆の辞書式順序でそれらを生成します。

順序が重要でない場合は、通常の python dict を使用できます。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}}
于 2015-05-26T15:54:56.967 に答える