【问题标题】:Nested list in python returns empty list during DFS recursionpython中的嵌套列表在DFS递归期间返回空列表
【发布时间】:2020-10-04 05:28:47
【问题描述】:

我有一个使用 defaultdict 表示 python3 中图形的邻接列表的图形字典,并希望在该图形上执行 DFS。 现在,问题是找到从起始词 beginWord 到 endWord 的所有路线,我正在应用 DFS 进行递归+回溯。

例如

beginWord = "hit"   
endWord = "cog"   
graph : defaultdict(<class 'list'>, {'hit': ['hot'], 'hot': ['dot', 'lot'], 'dot': ['dog'], 'lot': ['log'], 'dog': ['cog'], 'log': ['cog']})

输出应该是这样的:

[["hit","hot","dot","dog","cog"],
  ["hit","hot","lot","log","cog"]]

我的方法:
我已经制作了图表并创建了两个新列表:path[] 和 ans[]。
path 基本上从 beginWord 开始直到它到达 endWord,当它到达时,我将它附加到 ans 变量(现在它是一个二维嵌套列表),然后从列表中弹出最后一个单词以触发回溯。 我将继续这样做,直到所有路径都被探索并存储在 ans[] 列表中。

问题:
ans[] 返回空列表,但它包含两个嵌套的空列表,这表明它知道答案是两个列表,这是正确的,但为什么会弹出这些项目?

我的代码:

def DFS(beginWord, endWord, graph, path, ans):

    path.append(beginWord)
    if beginWord == endWord:
        ans.append(path)
        path.pop()
        return

    for i in graph[beginWord]:
        DFS(i, endWord, graph, path, ans)

    path.pop()

注意:对 ans[] 使用 extend 而不是 append 有效(不完全是,但我得到了路径)但为什么不 append 呢?

【问题讨论】:

    标签: python list recursion python-3.6 depth-first-search


    【解决方案1】:

    您只有一个列表path。当您修改此列表时,您会在它出现的任何地方修改它,包括您将它推送到 ans 的位置。

    相反,您需要ans.append(path.copy()) 之类的东西,它会在将路径附加到答案之前复制路径。您对path 所做的任何后续更改都不会影响您已经推送到ans 的内容。

    【讨论】:

    • 非常感谢@Frank Yellin 的回答。如果我理解正确,那么 ans(即 2d 列表)创建了对路径列表的引用,该路径列表已被修改,然后同样反映在 ans 列表中?
    • 正确。您推送到ans 的值和变量path 的值都引用Python 中的单个值。所有引用都可以看到对列表所做的任何更改。您需要创建该值的副本,以便拥有一个看起来与旧值一样但未链接到旧值的“新”值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2022-08-24
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多