Python 3:TypeError:'int'对象在字符串元素列表中不可迭代

问题描述 投票:0回答:1

我正在尝试实现由邻接列表表示的图数据结构。我使用一个字典,顶点作为键,每个键可以有一个或多个值。值包含一个列表,该列表包含键顶点所连接的另一个顶点,以及顶点之间的遍历成本(无向图)。由于顶点可以连接到其他几个顶点,因此某个键的值可以由嵌套列表组成。

我知道我的实现不是非常面向对象的,而且我的代码可以在很多方面得到改进,但我现在想保持这样,因为当我从非常糟糕的事情开始并且之后改进它时我学得更好。

我遇到函数is_connected(self,node1,node2)的问题。我试图通过首先将每个键的值复制到两个单独的列表来查看两个顶点是否已连接(在邻接列表中)。然后,我为每个列表执行列表推导,以便展平任何嵌套列表。我们的想法是检查每个顶点是否在彼此的值列表中,从而得出它们是否连接的结论。

但是,在尝试进行列表理解时会出现问题。

class UndirectedGraph():
    def __init__(self):
        self.vertices = my_dict = {
                                    'A' : ['B', 10],
                                    'B' : [['A', 10], ['C', 5]],
                                    'C' : [['B', 5], ['D', 15]],
                                    'D' : [['C', 15], ['E', 25]],
                                    'E' : ['D', 25]
                                                    }
    def __str__(self):
        return str(self.vertices)

    def add(self, new_node):
        if new_node in self.vertices:
            return False
        else:
            self.vertices[new_node] = []
            return True

    def connect(self, node1, node2, cost):
        if node1 in self.vertices and node2 in self.vertices:
            if self.is_connected(node1, node2):
                for x, y in [(x, y) for x in self.vertices.get(node1) for y in self.vertices.get(node2)]:
                    if node2 in x and node1 in y:
                        x[1] = cost
                        y[1] = cost
            else:
                if node1 == node2:
                    node1_values = [node2, cost]
                    self.vertices[node1].append(node1_values)
                else:
                    node1_values = [node2, cost]
                    self.vertices[node1].append(node1_values)
                    node2_values = [node1, cost]
                    self.vertices[node2].append(node2_values)

    def is_connected(self, node1, node2):
        node1_values = self.vertices[node1]
        node2_values = self.vertices[node2]
        n1 = [str(item) for sublist in node1_values for item in sublist]
        n2 = [str(item) for sublist in node2_values for item in sublist]

        if node2 in n1 and node1 in n2:
            print(node1, "and", node2, "are connected")
            return True
        else:
            print(node1, "and", node2, "are not connected")
            return False

我创建了n类实例并调用方法is_connected(self,node1,node2)

g = UndirectedGraph()
g.is_connected('A', 'B')

我收到以下错误:

Traceback (most recent call last):
  File ".\UndirectedGraph.py", line 83, in <module>
    g.is_connected('A', 'B')
  File ".\UndirectedGraph.py", line 53, in is_connected
    n1 = [str(item) for sublist in node1_values for item in sublist]
  File ".\UndirectedGraph.py", line 53, in <listcomp>
    n1 = [str(item) for sublist in node1_values for item in sublist]
TypeError: 'int' object is not iterable

我怀疑它与值列表中的某些元素是整数这一事实有关,这就是为什么在列表理解时尝试将它们转换为String对象的原因,但我猜它们仍然被解释为整数。

我想也许我必须在列表理解之前进行整数到字符串的转换,但我还没有找到任何其他解决方案而不是.join()方法,我不想这样做使用是因为我希望能够将两个不同列表的元素相互比较。如果我使用.join()方法,这意味着我必须将所有值添加到String中,并将String拆分为列表?

我该如何解决这个问题?

提前致谢!或者有没有

python typeerror iterable undirected-graph
1个回答
1
投票

比较这两个节点(来自你的self.vertices dict):

'A' : ['B', 10],
'B' : [['A', 10], ['C', 5]],

我假设这应该表示节点'A'的边缘到节点'B',成本为10,节点'B'具有相同的边缘加上另一个边缘到节点'C',成本为5.基本上,你的vertices字典是应该从节点名称(例如'A')映射到“带有成本的边缘列表”。但是,对于节点“A”,您忘记包含外部列表:dict-value不是嵌套列表。修复很简单:

        # in you __init__ function
        self.vertices = my_dict = {
                                    'A' : [['B', 10]],
                                    'B' : [['A', 10], ['C', 5]],
                                    'C' : [['B', 5], ['D', 15]],
                                    'D' : [['C', 15], ['E', 25]],
                                    'E' : [['D', 25]]
                                                    }

有了这个修复,我得到:

>>> g = UndirectedGraph()
>>> g.is_connected('A', 'B')
('A', 'and', 'B', 'are connected')
© www.soinside.com 2019 - 2024. All rights reserved.