将边添加到networkx图时的KeyError

时间:2016-11-27 23:13:16

标签: python python-3.5 networkx keyerror

您好我正在处理ProjectEuler问题82,并在添加边缘时遇到KeyError。奇怪的是,KeyError几乎每次都引用不同的dict_values。这是代码......

import networkx as nx

with open("p082_matrix.txt") as key_file:
entries = key_file.readlines()


def split_and_cast(line_of_nums):
    nums = line_of_nums.split(",")
    return [int(x) for x in nums]


matrix_list = [split_and_cast(row) for row in entries]

for i in matrix_list:
    print(i)


class Point:
    """A two dimensional point object"""
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __hash__(self):
        return hash(self.__dict__.values())

    def __repr__(self):
        return str(self.__dict__.values())


graph = nx.Graph()
for i in range(82):
    for j in range(82):
        graph.add_node(Point(i, j))

for i in range(81):
    for j in range(80):
        point = Point(i, j)
        try:
            upper_value = matrix_list[i-1][j]
            graph.add_edge(point, Point(i-1, j), weight=upper_value)
        except IndexError:
            pass
        try:

            right_value = matrix_list[i][j+1]
            graph.add_edge(point, Point(i, j+1), weight=right_value)

        except IndexError:
            pass
        try:

            lower_value = matrix_list[i+1][j]
            graph.add_edge(point, Point(i+1, j), weight=lower_value)

        except IndexError:
            pass

以下是错误代码示例...

Traceback (most recent call last):
  File "C:/Users/Name/PycharmProjects/ProjectEuler/PE82.py", line 50, in    <module>
graph.add_edge(point, Point(i, j+1), weight=right_value)
  File "C:\Users\Name\AppData\Local\Programs\Python\Python35-32\lib\site-    packages\networkx-1.11-py3.5.egg\networkx\classes\graph.py", line 798, in add_edge
    datadict = self.adj[u].get(v, self.edge_attr_dict_factory())
KeyError: dict_values([60, 4])

第二个错误代码

Traceback (most recent call last):
  File "C:/Users/Name/PycharmProjects/ProjectEuler/PE82.py", line 44, in <module>
    graph.add_edge(point, Point(i-1, j), weight=upper_value)
  File "C:\Users\Name\AppData\Local\Programs\Python\Python35-32\lib\site- packages\networkx-1.11-py3.5.egg\networkx\classes\graph.py", line 800, in  add_edge
    self.adj[u][v] = datadict
KeyError: dict_values([14, 8])

另一个......

Traceback (most recent call last):
  File "C:/Users/Name/PycharmProjects/ProjectEuler/PE82.py", line 50, in <module>
    graph.add_edge(point, Point(i, j+1), weight=right_value)
  File "C:\Users\Name\AppData\Local\Programs\Python\Python35-32\lib\site-packages\networkx-1.11-py3.5.egg\networkx\classes\graph.py", line 798, in add_edge
    datadict = self.adj[u].get(v, self.edge_attr_dict_factory())
KeyError: dict_values([5, 76])    

fyi我来自Java背景。如果答案可以与Java中的某些内容相关,那将会很有帮助。

0 个答案:

没有答案