Python中的树构建错误

2024-10-02 14:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

data = {'murtaza':('arnav', 'ohjun'),
        'ohjun':('arnav', 'murtaza'),
        'arnav':('ohjun', 'murtaza')}

class node:
    predecessors=[]
    nexts=[]
    student=''
    def __init__(self, student='', predecessors=[]):
        self.student=student
        self.predecessors=predecessors
    def grow(self, max=6, depth=0):
        if not self.student in self.predecessors:
            self.predecessors.append(self.student)
            for pref in data[self.student]:
                next=node(pref, self.predecessors)
                print(depth, self.predecessors, self.student, pref)
                next.grow(max, depth=depth+1)
                self.nexts.append(next)
        else:
            return

所以,这里是我的节点数据和类定义。当我在一个节点对象上调用grow()方法时,我预期会发生以下情况:它在数据中查找学生名,然后为与该学生相关联的每个名称(即他们的首选项,因此for pref in data[self.student])创建一个新节点,将其添加到从当前节点分支出来的节点,然后在该新节点上调用grow()。然后,该方法将继续构建树,除非学生在序列中出现两次,因此检查if not self.student in self.predecessors

问题似乎是树中没有正确地记住前辈。出于某种原因,兄弟节点突然获得了其子节点的所有前辈。以下是程序的输出:

0 ['murtaza'] murtaza arnav
1 ['murtaza', 'arnav'] arnav ohjun
2 ['murtaza', 'arnav', 'ohjun'] ohjun arnav
2 ['murtaza', 'arnav', 'ohjun'] ohjun murtaza #as expected up to here
1 ['murtaza', 'arnav', 'ohjun'] arnav murtaza
0 ['murtaza', 'arnav', 'ohjun'] murtaza ohjun

我希望你能读到:

0 ['murtaza'] murtaza arnav
1 ['murtaza', 'arnav'] arnav ohjun
2 ['murtaza', 'arnav', 'ohjun'] ohjun arnav
2 ['murtaza', 'arnav', 'ohjun'] ohjun murtaza 
1 ['murtaza', 'arnav'] arnav murtaza
0 ['murtaza'] murtaza ohjun
1 ['murtaza', 'ohjun'] ohjun arnav
2 ['murtaza', 'ohjun', 'arnav'] arnav ohjun
2 ['murtaza', 'ohjun', 'arnav'] arnav murtaza
1 ['murtaza', 'ohjun'] ohjun murtaza

我是理解错了代码,还是理解错了算法?还是我的实现错了?我真的以为我知道如何做一棵树,但这似乎不是我认为应该的工作方式

编辑:我应该补充一点,主体是这样的:

mort = node()
mort.student='murtaza'
mort.grow()

Tags: inselfnodedata节点student学生next
1条回答
网友
1楼 · 发布于 2024-10-02 14:20:40

这一行:

next=node(pref, self.predecessors)

不复制self.predecessors,而是传递对命名的list对象的引用。同样,这一行:

    self.predecessors=predecessors

不制作predecessors的副本。因此,所有node对象都在完全相同的列表上运行;当一个对象调用.append()时,所有对象的predecessor列表都会更新

解决方案是将其中一个调用替换为copy.deepcopy(),如下所示:

    self.predecessors = copy.deepcopy(predecessors)

根据您的精确数据结构,您可能需要copy.copy()

此外,可能与您的问题无关,您在__init__()中为predecessors提供的默认值将无法按您预期的方式工作(见here)。请尝试以下方法:

def __init__(self, student='', predecessors=None):
    self.student=student
    if predecessors is None:
        self.predecessors = []
    else:
        self.predecessors=copy.deepcopy(predecessors)

相关问题 更多 >