遍历数据结构时如何追踪已访问节点?Python实现方案探讨
问题:遍历可变对象组成的结构化数据时,如何避免重复访问?
我是Python新手,正在阅读Mark Lutz所著的《Learning Python》。书中第9章末尾的「警惕循环数据结构」部分提到,在遍历嵌套结构、图等结构化数据时需避免循环(或重复访问),建议使用列表、字典或集合记录已访问项。
这点很清晰,集合似乎是合适的选择。但如果数据结构由各种可变对象组成,这些对象无法加入集合,因为Python集合仅接受不可变(或可哈希)对象,即以下伪代码无法生效:
if node not in visited: visited.append(node) process(node)
请问采用Python风格的实现方式,有什么好的解决办法?我有几个思路,但不确定哪种更合适:
- 使用集合追踪
id(obj)而非对象引用本身,但我感觉id()是Python内部实现细节,这样用有点投机取巧。if id(node) not in visited: - 为数据结构/图中的每个对象添加唯一索引属性,用集合追踪该索引。如果所有对象都是同一类或至少是类实例,这种方法很简单,但如果部分节点是列表这类对象,就无法实现。
if node.index not in visited: ... - 使用列表记录已访问项,但集合在概念上正是所需的工具,用列表模拟集合似乎不太理想。
内容的提问来源于stack exchange,提问作者holplugh
相关产品推荐
相关产品推荐

