73714


Jupyter NotebookでPython3を使用しています。  
ネットワークの作成、計算にはNetworkXを使用しています。

ネットワークグラフGについて、  
エッジをkeyとする、辞書型データdict_1、dict_2、dict_3があります。

dict_1:エッジのタイプの辞書型データ  
dict_2:エッジの評価値の辞書型データ  
dict_3:エッジの長さの辞書型データ

dict_1の属性値(v1)がtype2の場合に、  
dict_2の属性値(v2)が正の場合は、dict_3の属性値(v3)に10を足し、  
dict_2の属性値(v2)が負の場合は、dict_3の属性値(v3)から10を引き、  
dict_3を更新したいです。

そして更新されたdict_3を使用して、  
グラフGのエッジの属性値（'length'）を書き換えたいと考えています。  
下記のコードで試行錯誤をしていますが、  
まず、dict_3を更新するところができていません。  
また、dict_3からグラフGのエッジの属性値を書き換えようとすると、  
すべて同じ値になってしまいます。

pythonはじめ、コーディングは初心者で、  
初歩的間違いをしている可能性がありますが、なかなか解決策が見つからず困っています。  
アドバイスを頂けると助かります。

[code]

    import networkx as nx
    import matplotlib.pyplot as plt
    
    G = nx.Graph()
    G.add_edges_from([(1,3),(3,2),(3, 4),(3, 5)])
    nx.draw_networkx(G)
    plt.show()
    
    dict_1 = {(1,3):'type1', (3,2):'type1', (3, 4):'type2',  (3, 5):'type3'}
    dict_2 = {(1,3):0, (3,2):0, (3, 4):-2, (3, 5):0}
    dict_3 = {(1,3):10, (3,2):5, (3, 4):60, (3, 5):100}
    
    nx.set_edge_attributes(G, dict_3, 'length')
    
    print(G.edges.data('length'))
    
[/code]

[(1, 3, 10), (3, 2, 5), (3, 4, 60), (3, 5, 100)]

[code]

    for v1 in dict_1.values():
        if v1 == 'type2':
            for v2 in dict_2.values():
                for v3 in dict_3.values():
                    for (u, v) in dict_3.keys():
                        if v2>0:
                            v3 = v3+10
                            dict_3[u, v]=v3
                        elif v2<0:
                            v3 = v3-10
                            dict_3[u, v]=v3
                        else:
                            break
    print(dict_3.values())
    
[/code]

dict_values([10, 5, 60, 100])

[code]

    for (u, v) in dict_3.keys():
        for le in dict_3.values():
            G.edges[u, v]['length'] = le
    
    print(G.edges.data('length'))
    
[/code]

[(1, 3, 100), (3, 2, 100), (3, 4, 100), (3, 5, 100)]


CC BY-SA 4.0
2021-01-31T05:42:12.003
73712
2021-02-10T04:16:34.527
2021-02-10T04:16:34.527
3060
43743
question
python python3 networkx
dictデータの条件分岐処理とネットワークデータ属性値の更新


`dict_3` の更新は, 同じエッジ(のキー) に対してデータを取得・更新する必要があるはずです  
(このキー, エッジをとりあえず `eg` 変数として扱う)

[code]

    for eg in dict_3.keys():
        v1 = dict_1[eg]
        v2 = dict_2[eg]
    
        if v1 == 'type2':
          if v2>0:
              dict_3[eg] += 10
          elif v2<0:
              dict_3[eg] -= 10
    
    print(dict_3)
    
[/code]

`+=` の部分は `dict_3[eg] = dict_3[eg] + 10` と同等, `-=` も同じ

* * *

グラフ, というか属性書き換えは, もとの処理にもあるようこれでよいのでは？

[code]

    nx.set_edge_attributes(G, dict_3, 'length')
    
[/code]

ループで行うには, (たぶん)このような処理 (…目的が一致してるか不明なので)

[code]

    for k, v in dict_3.items():
        G.edges[k]['length'] = v
    
    
[/code]


CC BY-SA 4.0
2021-01-31T07:36:05.743
73714
2021-01-31T07:36:05.743
43025
73712
answer