Python 3:TypeError:';int';对象在字符串元素列表上不可编辑
我试图实现一个由邻接列表表示的图形数据结构。我正在使用一个以顶点为关键点的字典,每个关键点可以有一个或多个值。值由一个列表组成,该列表包含键vertice连接到的另一个vertice,以及顶点之间的遍历成本(无向图)。由于顶点可以连接到其他几个顶点,因此某个关键点的值可以由嵌套列表组成 我知道我的实现不是非常面向对象的,我的代码可以在很多方面得到改进,但我现在想保持这种状态,因为当我开始做一些非常糟糕的事情并在以后改进它时,我会学得更好 我对连接的函数(self、node1、node2)有问题。我试图通过首先将每个关键点的值复制到两个单独的列表来查看两个顶点是否连接(在邻接列表中)。然后,我对每个列表执行列表理解,以便展平任何嵌套列表。其目的是检查每个垂直点是否在彼此的价值列表中,从而得出它们是否相互关联 然而,当试图理解列表时,问题就出现了Python 3:TypeError:';int';对象在字符串元素列表上不可编辑,python,typeerror,iterable,undirected-graph,Python,Typeerror,Iterable,Undirected Graph,我试图实现一个由邻接列表表示的图形数据结构。我正在使用一个以顶点为关键点的字典,每个关键点可以有一个或多个值。值由一个列表组成,该列表包含键vertice连接到的另一个vertice,以及顶点之间的遍历成本(无向图)。由于顶点可以连接到其他几个顶点,因此某个关键点的值可以由嵌套列表组成 我知道我的实现不是非常面向对象的,我的代码可以在很多方面得到改进,但我现在想保持这种状态,因为当我开始做一些非常糟糕的事情并在以后改进它时,我会学得更好 我对连接的函数(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)
我得到以下错误:
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
回溯(最近一次呼叫最后一次):
文件“\UndirectedGraph.py”,第83行,在
g、 _是否已连接('A'、'B')
中第53行的文件“\UndirectedGraph.py”已连接
n1=[节点1中子列表的str(项目)\子列表中项目的U值]
文件“\UndirectedGraph.py”,第53行,在
n1=[节点1中子列表的str(项目)\子列表中项目的U值]
TypeError:“int”对象不可编辑
我怀疑这与值列表中的某些元素是整数这一事实有关,这就是为什么在开始时试图将它们转换为字符串对象,但我猜它们仍然被解释为整数
我在想,也许在理解列表之前我必须进行整数到字符串的转换,但是除了.join()方法之外,我还没有找到任何其他解决方案,我不想使用它,因为我想能够比较两个不同列表的元素。如果我使用.join()方法,这意味着我必须将所有值添加到一个字符串中,然后将该字符串拆分为一个列表
我如何解决这个问题
提前谢谢!
或者是否有任何比较这两个节点(从您的self.vertices
dict):
'A':[B',10],
“B”:[A',10],[C',5],
我假设这表示节点“A”的边到节点“B”的成本为10,节点“B”的边到节点“C”的成本为5。本质上,您的顶点
dict应该从节点名称(例如“A”)映射到“带成本的边列表”。但是,对于节点“A”,您忘记包含外部列表:dict值不是嵌套列表。解决方法很简单:
#在你里面uuu初始化uu函数
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=无向图()
>>>g.是否连接(“A”、“B”)
(“A”、“B”、“已连接”)
错误基本上是告诉您没有您认为拥有的嵌套列表结构,因此并非每个子列表都是实际的iterable。我建议您看看在内存中表示图形的常用方法:。您将非常希望使用这些工具轻松实现最常见的图形算法。此外,由于图形是无向的,您不需要检查两个节点是否相互连接,因为连接是相互的
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