Python循环中如何根据属性引用特定对象?环形图节点关联问题
解决方案
你的核心问题在于无法通过pos快速定位对应的Node实例,因为你把Node作为字典的键,而字典的keys()是不可索引的视图对象,没法直接通过pos-1来取值。另外代码里还有逻辑错误(比如判断node.pos==50,但你的节点pos范围是1-20),下面是修正后的实现:
关键调整点
- 新增
pos_to_node字典,专门用来通过pos值映射到对应的Node实例,解决节点查找的问题。 - 把
graph的类型从defaultdict(Node)改为普通字典,值用列表存储邻居节点(更符合图的边存储逻辑)。 - 修正环形逻辑:
pos=1的节点邻居是pos=20的节点,其余节点邻居是pos-1的节点,同时无向图需要互相添加邻居。
完整代码
from collections import defaultdict # 假设你的Node类定义大致如下(需确保pos属性可访问) class Node: def __init__(self, pos, attr1, attr2, attr3): self.pos = pos self.attr1 = attr1 self.attr2 = attr2 self.attr3 = attr3 # 可选:添加__repr__方便调试 def __repr__(self): return f"Node(pos={self.pos})" class Graph: def __init__(self) -> None: # graph字典:键是Node实例,值是邻居Node列表 self.graph = {} # 新增:通过pos快速查找Node的映射字典 self.pos_to_node = {} for i in range(1, 21): node = Node(i, False, False, False) self.graph[node] = [] self.pos_to_node[i] = node def edge_gen(self): for node in self.graph.keys(): # 计算前一个节点的pos if node.pos == 1: prev_pos = 20 else: prev_pos = node.pos - 1 # 通过pos_to_node获取前一个节点实例 prev_node = self.pos_to_node[prev_pos] # 无向图:互相添加为邻居 self.graph[node].append(prev_node) self.graph[prev_node].append(node) return self.graph # 测试示例 g = Graph() graph = g.edge_gen() # 打印pos=1的邻居,应该是Node(pos=20)和Node(pos=2) print(f"Node(pos=1)的邻居: {graph[g.pos_to_node[1]]}") # 打印pos=20的邻居,应该是Node(pos=19)和Node(pos=1) print(f"Node(pos=20)的邻居: {graph[g.pos_to_node[20]]}")
代码说明
pos_to_node字典在初始化时完成pos到Node的映射,后续可以O(1)时间找到任意pos对应的节点。edge_gen方法通过简单条件判断处理环形边界(pos=1的特殊情况),其余节点直接取pos-1对应的节点。- 无向图的边是双向的,所以需要给当前节点和前一个节点互相添加邻居。
内容的提问来源于stack exchange,提问作者shaded
相关产品推荐
相关产品推荐

