gpt4 book ai didi

python - networkx 按属性搜索节点

转载 作者:行者123 更新时间:2023-12-05 04:05:57 28 4
gpt4 key购买 nike

我寻找更优雅的方式来从以下属性之一搜索有向图中的节点:

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.nodes.data() 获取 node_id,attrs 元组:

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

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

最佳答案

“更优雅的方式”真的很主观......我提出这两种方法:

[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 中实现 lambda 函数,你需要通过上面的表达式,因为在 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}}

关于python - networkx 按属性搜索节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447951/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com