You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环中如何根据属性引用特定对象?环形图节点关联问题

解决方案

你的核心问题在于无法通过pos快速定位对应的Node实例,因为你把Node作为字典的键,而字典的keys()是不可索引的视图对象,没法直接通过pos-1来取值。另外代码里还有逻辑错误(比如判断node.pos==50,但你的节点pos范围是1-20),下面是修正后的实现:

关键调整点

  1. 新增pos_to_node字典,专门用来通过pos值映射到对应的Node实例,解决节点查找的问题。
  2. 把graph的类型从defaultdict(Node)改为普通字典,值用列表存储邻居节点(更符合图的边存储逻辑)。
  3. 修正环形逻辑: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:20:48