首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何遍历defaultdict?

如何遍历defaultdict?
EN

Stack Overflow用户
提问于 2019-04-04 20:47:02
回答 2查看 1.3K关注 0票数 1

我有下面的代码来建立拓扑顺序:

代码语言:javascript
复制
from collections import defaultdict 

class Graph: 
    def __init__(self): 
        self.graph = defaultdict(list)
        self.V = 0  #number of nodes

    def addEdge(self,u,v): 
        self.graph[u].append(v) 
        self.V = self.V + 1

    def topologicalSortUtil(self,v,visited,stack): 

        visited[v] = True

        for i in self.graph[v]: 
            if visited[i] == False: 
                self.topologicalSortUtil(i,visited,stack) 

        stack.insert(0,v) 

    # topologicalSortUtil() 
    def topologicalSort(self): 
        # Mark all the vertices as not visited 
        visited = [False]*self.V 
        stack =[] 

        for i in range(self.V): 
            if visited[i] == False: 
                self.topologicalSortUtil(i,visited,stack) 

        print stack 

g= Graph() 
g.addEdge(5, 2); 
g.addEdge(5, 0); 
g.addEdge(4, 0); 
g.addEdge(4, 1); 
g.addEdge(2, 3); 
g.addEdge(3, 1); 

g.topologicalSort() 

它规定:

代码语言:javascript
复制
[5, 4, 3, 2, 1, 0]

现在,我希望我的代码能够处理字符串作为键:

代码语言:javascript
复制
g.addEdge('f', 'c')
g.addEdge('f', 'a')
g.addEdge('e', 'a')
g.addEdge('e', 'b')
g.addEdge('c', 'd')
g.addEdge('d', 'b')

(只要把数字改成字母.0='a',1='b‘等)不过,这不管用。

它应给予:

代码语言:javascript
复制
['f', 'e', 'd', 'c', 'b', 'a']

问题在于:

代码语言:javascript
复制
for i in range(self.V):
    if visited[i] is False:
        self.topologicalSortUtil(i, visited, stack)

代码在range上迭代,而不是在实际的节点键上迭代。

我试着把它转换成:

代码语言:javascript
复制
for i in self.graph.items():

但不起作用。

代码语言:javascript
复制
TypeError: list indices must be integers or slices, not tuple

我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-04 21:10:26

在您的类Graph中,有一些东西可以被概括为接受字母和数字作为顶点的名称。

以下是一个建议:

代码语言:javascript
复制
class Graph:
    def __init__(self, name_of_vertices):
        self.graph = collections.defaultdict(list)
        self.name_of_vertices = name_of_vertices     # define all vertices by name

    def add_edge(self, v, other_v):
        self.graph[v].append(other_v)

    def _topological_sort(self, v, visited, stack):
        visited[v] = True

        for other_v in self.graph[v]:
            if not visited[other_v]:
                self._topological_sort(other_v, visited, stack)

        stack.insert(0, v)

    def topological_sort(self):
        # Mark all the vertices as not visited
        visited = {
            v: False
            for v in self.name_of_vertices}
        stack = []

        for v in self.name_of_vertices:
            if not visited[v]:
                self._topological_sort(v, visited, stack)

        print(stack)

然后你可以使用这个:

代码语言:javascript
复制
g = Graph(['z', 'a', 'b', 'c', 'd', 'e'])
g.add_edge('e', 'b')
g.add_edge('e', 'z')
g.add_edge('d', 'z')
g.add_edge('d', 'a')
g.add_edge('b', 'c')
g.add_edge('c', 'a')
g.topological_sort()
# prints: ['e', 'd', 'b', 'c', 'a', 'z']

g = Graph(list(range(6)))
g.add_edge(5, 2)
g.add_edge(5, 0)
g.add_edge(4, 0)
g.add_edge(4, 1)
g.add_edge(2, 3)
g.add_edge(3, 1)
g.topological_sort()
# prints: [5, 4, 2, 3, 1, 0]
票数 1
EN

Stack Overflow用户

发布于 2019-04-04 20:55:45

dict.items()返回(key, value)的元组。

尝试更改您的代码,以获得密钥。

代码语言:javascript
复制
for i in self.graph.keys():

或者这个

代码语言:javascript
复制
for i, _ in self.graph.items():
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55524645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档