networkx поиск узла по атрибутам - PullRequest
0 голосов
/ 21 мая 2018

Я ищу более удобный способ поиска узла в DiGraph из одного из этих атрибутов: *

g = nx.DiGraph()
g.add_nodes_from([(1, dict(d=0, a=7)), (2, dict(d=0, a=6))])
g.add_nodes_from([(11, dict(d=1, a=4)), (12, dict(d=1, a=9))])
g.add_nodes_from([(21, dict(d=1, a=4)), (121, dict(d=2, a=7))])
g.add_edges_from([(1, 11), (1, 12), (2, 21), (12, 121)])
g.nodes.data()
# NodeDataView({1: {'d': 0, 'a': 7}, 2: {'d': 0, 'a': 6},
#              11: {'d': 1, 'a': 4}, 12: {'d': 1, 'a': 9},
#              21: {'d': 1, 'a': 4}, 121: {'d': 2, 'a': 7}})

Сейчас я использую g.node.data(), чтобы получить node_id, attrs tuple:

def search(g, d, a):
    for nid, attrs in g.node.data():
        if attrs.get('d') == d and attrs.get('a') == a:
            return nid

search(g, d=1, a=9)
# 12

1 Ответ

0 голосов
/ 22 мая 2018

«Более элегантный способ» действительно субъективен ... Я предлагаю эти два подхода:

[x for x,y in g.nodes(data=True) if y['d']==1 and y['a'] == 9]
#[12]

dict(filter(lambda x: x[0] if x[1]['a'] == 9 and x[1]['d'] == 1 else False, g.nodes(data=True)))
#{12: {'a': 9, 'd': 1}}

Вероятно, функция фильтра более эффективна при большом количестве данных.Интересно, что если вы хотите реализовать лямбда-функцию в Python 3, вам нужно пройти через вышеприведенное выражение, так как в Python 3 распаковка параметров кортежа больше не поддерживается.В Python 2.7 это может быть более элегантно:

dict(filter(lambda (x,y): x if y['a'] == 9 and y['d'] == 1 else False, g.nodes(data=True)))
#{12: {'a': 9, 'd': 1}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...