如何在NetworkX中无需键名获取所有节点属性?
解决NetworkX中无需键名访问节点属性的问题
首先咱们先理清两个核心问题:你当前代码只返回属性键名的原因,以及如何实现“无需键名访问”的需求。
为什么你的遍历代码只返回键名?
你遍历节点属性的代码里,nodex[1]是NetworkX存储节点属性的字典,当你直接for b in nodex[1]时,Python默认会遍历字典的键,所以你看到的只是你设置的myattibute(注意这里你拼写错了,应该是myattribute)这个键,而不是对应的属性值。
另外,你添加节点的代码还有个语法错误:关键字参数不能用字符串作为键,应该把'myattibute' = attribute改成myattribute=attribute(去掉引号,同时修正拼写),正确的添加代码应该是:
import csv import networkx as nx G = nx.Graph() csv_F = csv.reader(open("MyFile.txt"), delimiter='/') for line in csv_F: node = line[0] attribute = line[1:] # 无指定属性键名 # 修正后的添加节点代码 G.add_node(node, myattribute=attribute)
如何获取属性值(无需键名访问)
因为NetworkX的节点属性本质是键值对字典,完全“无键”是做不到的,但我们可以通过几种方式实现不用手动写键名就能访问属性:
方法1:直接取属性字典的唯一值(适合所有节点只有一个属性的情况)
如果你的每个节点都只有这一个属性,可以直接提取字典的唯一值,不用写键名:
for node, attrs in G.nodes(data=True): # 取字典的第一个(也是唯一的)值 attr_value = next(iter(attrs.values())) print(f"节点 {node} 的属性: {attr_value} ---")
方法2:把属性列表转成索引键的字典(适合多属性的情况)
如果line[1:]是多个属性值的列表,你可以把列表转成以索引为键的字典,这样访问时只用索引,不用自定义键名:
# 修改添加节点的代码 csv_F = csv.reader(open("MyFile.txt"), delimiter='/') for line in csv_F: node = line[0] attributes = line[1:] # 将列表转为{0: 值1, 1: 值2, ...}的字典 attr_dict = dict(enumerate(attributes)) G.add_node(node, **attr_dict) # 遍历访问属性,不用记住自定义键名 for node, attrs in G.nodes(data=True): # 遍历所有属性值 for idx, value in attrs.items(): print(f"节点 {node} 的第{idx}个属性: {value} ---") # 或者直接按索引访问,比如取第一个属性 print(f"节点 {node} 的第一个属性: {attrs[0]}")
方法3:遍历属性字典的所有值(不管键名)
如果只是想打印所有属性值,不管键是什么,可以直接遍历字典的values():
for node, attrs in G.nodes(data=True): for value in attrs.values(): print(value, " ---")
内容的提问来源于stack exchange,提问作者Shrewd
相关产品推荐
相关产品推荐

