Posted at

[NetworkX]特定の属性を持つノードを検索したい

More than 3 years have passed since last update.


概要

研究でNetworkXを使っているのですが,特定の属性を持つノードを検索したくなって,そのようなメソッドがあるか探してみた結果どうやらなさそうなので作りました.


コード


find_specific_attribute_node.py

import networkx as nx

def find_specific_attribute_node(G, attr, value):

result = []

d = nx.get_node_attributes(G, attr)

for key, v in d.items():
if(v == value):
result.append(key)

return result



動作例

以下の様なテストプログラムを走らせてみます.


find_node_test_for_qiita.py

import networkx as nx

from find_specific_attribute_node import find_specific_attribute_node as find_nodes
if __name__ == '__main__':

Graph = nx.DiGraph()

Graph.add_node('a', color = 'blue')
Graph.add_node('b', color = 'red')
Graph.add_node('c', color = 'blue')
Graph.add_node('d', color = 'red')
Graph.add_node('e', color = 'blue')
Graph.add_node('f', color = 'red')

print(find_nodes(Graph, 'color', 'blue'))


以下実行結果です.


実行結果

['a', 'e', 'c']


color属性にblueが設定されているノード名からなるリストが取得できていることがわかります.


説明

すごい適当に作ったものなのでアレですが,引数は以下の3つです.


  • G : 検索対象となるグラフ

  • attr : 検索したい属性名

  • value : 見つけたいattrの値

返り値は見つかったノード名のリストです.


おわりに

すごく要求されそうなものなので実際はNetworkXに似たような機能のメソッドが存在しているのかもしれません.誰か教えて下さい.

あと,メソッドとかの命名規則をちゃんと勉強してないので,「こういう名前をつけたほうがいい」とかありましたら教えていただけると僕が嬉しいです……