Python 如果可以';你不能输入钥匙吗?

Python 如果可以';你不能输入钥匙吗?,python,python-2.7,dictionary,key,Python,Python 2.7,Dictionary,Key,所以我试图翻阅一本用来教授不同类型的模型和算法的书,我发现了这个问题。我的代码如下。本质上,它生成图形的文本输出。单个点称为“顶点”,连接它们的线称为“边”。我现在要做的是检查两个顶点之间是否存在边 class Graph(dict): def __init__(self, vs=[], es=[]): for v in vs: self.add_vertex(v) for e in es: self.add

所以我试图翻阅一本用来教授不同类型的模型和算法的书,我发现了这个问题。我的代码如下。本质上,它生成图形的文本输出。单个点称为“顶点”,连接它们的线称为“边”。我现在要做的是检查两个顶点之间是否存在边

class Graph(dict):
    def __init__(self, vs=[], es=[]):
        for v in vs:
            self.add_vertex(v)
        for e in es:
            self.add_edge(e)

    def add_vertex(self, v):
        self[v] = {}

    def add_edge(self, e):
        v,w = e
        self[v][w] = e
        self[w][v] = e

    def get_edge(self, v, w):
        g = dict(self)
        keys = g.keys()
        return type(keys[0])

    def remove_edge(self, e):
        pass

    def vertices(self):
        keys = self.keys()
        return keys

class Vertex(object):
    def __init__(self, label=''):
        self.label = label

    def __repr__(self):
        return 'Vertex(%s)' % repr(self.label)

    __str__ = __repr__

class Edge(tuple):
    def __new__(cls, e1, e2):
        return tuple.__new__(cls, (e1, e2))

    def __repr__(self):
        return 'Edge(%s, %s)' % (repr(self[0]), repr(self[1]))

    __str__ = __repr__

v = Vertex('v')
w = Vertex('w')
e = Edge(v, w)
print e

g = Graph([v,w],[e])
print g


edge = Graph.get_edge(g, 'v', 'w')
print edge
问题在于:

def get_edge(self, v, w):
        g = dict(self)
        keys = g.keys()
        return type(keys[0])

我无法访问字典中的值,因为我无法使用键,返回类型行显示了原因:

输出:

Edge(Vertex('v'), Vertex('w'))
{Vertex('v'): {Vertex('w'): Edge(Vertex('v'), Vertex('w'))}, Vertex('w'):{Vertex('v'): Edge(Vertex('v'), Vertex('w'))}}
<class '__main__.Vertex'>
边(顶点('v')、顶点('w'))
{顶点('v'):{顶点('w'):边(顶点('v'),顶点('w'))},顶点('w'):{顶点('v'):边(顶点('v'),顶点('w'))}

问题在于关键点不是字符串、整数或我可以引用的任何东西,它们是通过调用Vertex类生成的。有什么方法可以让我找到我丢失的钥匙吗?我的目标是让该方法返回请求的边(如果存在)。

“我无法访问字典中的值,因为我无法使用键”-什么意思,您不能使用键?它们就在那里,
v
w
。为什么顶点的实例不是“我可以引用的任何东西”?您没有实现
\uuuuuu eq\uuuuu
\uuu ne\uuuuu
\uuuuu hash\uuuuuuu
,所以您的顶点和边都是通过身份进行比较的。这就是你想要的吗?同意上面的用户。您需要实现一种方法来唯一地散列每个顶点,或者实现一种严格明确的方法来确定两个顶点是否相同。否则,python将检查它们是否是相同的实例,而不一定是相同的节点,但是您选择定义一个节点。“我无法访问字典中的值,因为我不能使用键”-什么意思,您不能使用键?它们就在那里,
v
w
。为什么顶点的实例不是“我可以引用的任何东西”?您没有实现
\uuuuuu eq\uuuuu
\uuu ne\uuuuu
\uuuuu hash\uuuuuuu
,所以您的顶点和边都是通过身份进行比较的。这就是你想要的吗?同意上面的用户。您需要实现一种方法来唯一地散列每个顶点,或者实现一种严格明确的方法来确定两个顶点是否相同。否则,python将检查它们是否是相同的实例,而不一定是相同的节点,但是您选择定义一个节点。