【发布时间】:2019-07-24 21:23:21
【问题描述】:
我正在尝试实现由邻接表表示的图形数据结构。我正在使用以顶点为键的字典,每个键可以有一个或多个值。一个值由一个列表组成,该列表包含键顶点连接到的另一个顶点,以及在顶点之间遍历的成本(无向图)。由于一个顶点可以连接到其他几个顶点,因此某个键的值可以由一个嵌套列表组成。
我知道我的实现不是非常面向对象,而且我的代码可以在很多方面进行改进,但我想暂时保持这种状态,因为当我从非常糟糕的事情开始并在之后改进时我会学得更好.
我遇到了函数 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
我怀疑这与值列表中的某些元素是整数这一事实有关,这就是为什么在列表理解的情况下尝试将它们转换为字符串对象的原因,但我猜它们仍然被解释作为整数。
我在想也许我必须在列表理解之前进行整数到字符串的转换,但除了 .join() 方法之外,我找不到任何其他解决方案 em>,我不想使用它,因为我希望能够将两个不同列表的元素相互比较。如果我使用 .join() 方法,这意味着我必须将所有值添加到字符串中,然后将字符串拆分为列表?
我该如何解决这个问题?
提前致谢! 或者有没有
【问题讨论】:
-
这个错误基本上是在告诉你,你没有你认为有的嵌套列表结构
-
所以并不是每个
sublist都是一个真正的可迭代对象。 -
我建议您查看图形在内存中的常用表示方式:wikipedia。您真的很想使用这些来轻松实现最常见的图形算法。此外,由于图形是无向的,您不需要检查 两个 节点是否相互连接,因为连接是互惠的
标签: python typeerror iterable undirected-graph