尝试将多个值附加到字典中的键时Python中的属性错误

时间:2015-12-01 08:21:47

标签: python dictionary

所以我一直试图解决这个错误一段时间,我似乎无法弄清问题是什么。我想要的是拥有一个包含各种键的字典,这些键可以与多个值相关联。我一直收到这个错误:

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()

任何帮助将不胜感激。

2 个答案:

答案 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]