【问题标题】:Can't resolve the issue : unsupported operand type(s) for -: 'dict' and 'set'无法解决问题:-: 'dict' 和 'set' 的操作数类型不受支持
【发布时间】:2020-08-14 00:07:47
【问题描述】:

我正在写一个dfs树遍历代码:

graph = {
    1 : {2,3},
    2 : {4,5},
    3 : {}    
}

def dfs(graph,start):
  visited = set()
  stack = [start]
  while stack:
    vertex = stack.pop()
    if vertex not in visited:
      visited.add(vertex)
    stack = list(graph[vertex] - visited) + stack
  return visited

v = dfs(graph,1)

调用函数v = dfs(graph,1)时出现如下错误:

<ipython-input-25-81ccabb8c90b> in dfs(graph, start)
      6     if vertex not in visited:
      7       visited.add(vertex)
----> 8     stack = list(graph[vertex] - visited) + stack
      9   return visited

TypeError: unsupported operand type(s) for -: 'dict' and 'set'

从字典中调用graph[vertex]时,图不是返回一个集合吗?那为什么操作给TypeError呢?

【问题讨论】:

    标签: python


    【解决方案1】:

    {} 是一个空字典,而不是一个空集。所以当vertex == 3graph[vertex] 是字典而不是集合时,graph[vertex] - visited 失败。

    要创建一个空集,请使用set()

    graph = {
        1 : {2,3},
        2 : {4,5},
        3 : set()    
    }
    

    【讨论】:

    • 嗯,明白了。但是我弄错了 dfs 遍历。
    • @develop_code 好吧,这是另一个问题,可能是一个新问题...如果当前问题已解决,您可以将答案标记为已接受
    • @develop_code 尝试将print(stack)print(visited) 添加到while 循环中,看看它的进展情况。
    • graph[2]{4, 5},但没有graph[4]graph[5]。这些边缘应该去哪里?
    • 您返回的是set,而不是list。因此无法从结果中判断它是按 DFS 顺序访问还是 BFS 顺序访问。
    【解决方案2】:

    问题是你混淆了{} 这是一个空字典和set() 这是空集。

    graph = {
        1 : {2,3},
        2 : {4,5},
        3 : set() # change this line   
    }
    
    def dfs(graph,start):
      visited = set()
      stack = [start]
      while stack:
        vertex = stack.pop()
        if vertex not in visited:
          visited.add(vertex)
        stack = list(graph[vertex] - visited) + stack
      return visited
    
    v = dfs(graph,1)
    

    如果您不想使用set(),您也可以使用{*()}

    【讨论】:

      猜你喜欢
      • 2022-08-10
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多