所以我一直试图解决这个错误一段时间,我似乎无法弄清问题是什么。我想要的是拥有一个包含各种键的字典,这些键可以与多个值相关联。我一直收到这个错误:
Traceback (most recent call last):
File "C:/Users/.py", line 34, in insert_nodes
self.__graph_dict[value].append(node2)
AttributeError: 'Node' object has no attribute 'append'
我完全有可能忽略一些小事,或者只是对我应该如何解决这个问题感到困惑。 我的代码如下:
class Node(object):
def __init__(self, value, colored):
self.value = value
self.colored = colored
class Graph(object):
def __init__(self):
self.graph_dict = {}
def nodes(self):
return self.nodes.keys()
def insert_nodes(self, value, neighbor):
node1 = Node(value, colored="blank")
node2 = Node(neighbor, colored="blank")
if value in self.graph_dict:
self.graph_dict.setdefault(value, [])
self.graph_dict[value].append(node2)
else:
self.graph_dict[value] = node2
def populate_graph(self):
graph_name = input("Enter your graph name ")
f = open(graph_name, 'r').readlines()
num_vertices = f.pop(0)
for lines in f:
pairs = lines.split(" ")
self.insert_nodes(int(pairs[0]), int(pairs[1].rstrip()))
g = Graph()
g.populate_graph()
任何帮助将不胜感激。
答案 0 :(得分:2)
Append()期待一个列表 - 因此graph_dict的字典内容不是列表。这是因为当你初始化它时,你给它一个值,而不是列表。 变化:
if value in self.graph_dict:
self.graph_dict.setdefault(value, [])
self.graph_dict[value].append(node2)
else:
self.graph_dict[value] = node2
为:
if value in self.graph_dict:
## not needed self.graph_dict.setdefault(value, [])
self.graph_dict[value].append(node2)
else:
self.graph_dict[value] = [node2]
答案 1 :(得分:0)
您可以按照以下方式利用collections.defaultdict
:
from collections import defaultdict
(...)
def __init__(self):
self.graph_dict = defaultdict(list)
(...)
def insert_nodes(self, value, neighbor):
node1 = Node(value, colored="blank")
node2 = Node(neighbor, colored="blank")
# no need for the if
self.graph_dict[value].append(node2)
另一个选项,以及在该方案中使用setdefault
的正确方法之一如下:
(...)
def insert_nodes(self, value, neighbor):
node1 = Node(value, colored="blank")
node2 = Node(neighbor, colored="blank")
self.graph_dict.setdefault(value, [])
self.graph_dict[value].append(node2)
虽然我不喜欢它,但它有效且可读,恕我直言。我仍然发现defaultdict
方法更具吸引力。
编辑:或者,或多或少等效但查找次数较少:
(...)
def insert_nodes(self, value, neighbor):
node1 = Node(value, colored="blank")
node2 = Node(neighbor, colored="blank")
self.graph_dict.setdefault(value, []).append(node2)
“请求宽恕以获得许可更好”......或类似的东西。它被认为是更加pythonic,它确实更快,只是尝试做它并捕获异常。
这与样式有关,因为@barny已经修复了这个bug。但是,我将其包括在内是为了完整性:
(...)
def insert_nodes(self, value, neighbor):
node1 = Node(value, colored="blank")
node2 = Node(neighbor, colored="blank")
try:
self.graph_dict[value].append(node2)
catch KeyError:
self.graph_dict[value] = [node2]