Python-基于键属性获取最大字典键

Python-基于键属性获取最大字典键,python,dictionary,attributes,key,max,Python,Dictionary,Attributes,Key,Max,我有一个节点类,定义如下(为了简化,我只复制了相关代码): 我还有一个字典,它将节点对象作为键,并将键节点的邻居列表作为每个键的值 successorTable = { Node(0, 1): [Node(1, 0)], Node(1, 0): [Node(0, 1)], # and so on ... } 现在我想做的是获取字典的键(节点对象),最大值为x,最大值为y 所以我基本上是想得到以下结果: # maxXNode -> Node(1, 0) # maxY

我有一个
节点
类,定义如下(为了简化,我只复制了相关代码):

我还有一个字典,它将
节点
对象作为键,并将键节点的邻居列表作为每个键的值

successorTable = {
    Node(0, 1): [Node(1, 0)],
    Node(1, 0): [Node(0, 1)],
    # and so on ...
}
现在我想做的是获取字典的键(节点对象),最大值为
x
,最大值为
y

所以我基本上是想得到以下结果:

# maxXNode -> Node(1, 0)
# maxYNode -> Node(0, 1)
你的问题 首先,对于你的问题,你可以这样做

max_x = max(successorTable.keys(), key=lambda n: n.x)
max_y = max(successorTable.keys(), key=lambda n: n.y)
其他问题 然后在你的代码上写一个字

我建议您小心使用
节点
作为字典键,因为您没有定义
\uuuuuuu散列
\uuuuuuuu eq
方法

d = {}
d[Node(0, 0)] = 0
d[Node(0, 0)] # raises a KeyError
默认情况下,对象通过其id进行散列和比较,因此具有相同坐标的两个节点不会散列为相同的值。你可能想这样解决这个问题

class Node(object):
    def __init__(self, x, y):
        self._x = x
        self._y = y
        self.neighbours = []

    @property
    def x(self):
        return self._x

    @property
    def y(self):
        return self._y

    def __hash__(self):
        return hash((self.x, self.y))

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

我们使用
\ux
\uy
属性
来强调这样一个事实,即这些属性在用于哈希时不应更新。

您的节点对象是否有
\uuhash\ucode>特殊方法?否则,这将无法按您的意愿工作。为什么您需要
可成功的
?这不是Node.neights的作用吗?也就是说,任何时候使用
successorTable[x]
,您都可以改为说
x.neights
。后续节点是节点在一个特定方向上的邻居。这就是为什么我需要
successorTable
,它是图形的属性,而不是节点的属性。然而,我会在一个非定向图中使用
Node.neights
。@jdehesa,你的回答给了我一个线索,尽管我不得不修改它。谢谢这是修改后的版本:
max\u key\u x=max(successorTable.keys(),key=lambda n:n.y).y
max\u key\u y=max(successorTable.keys(),key=lambda n:n.x).x
class Node(object):
    def __init__(self, x, y):
        self._x = x
        self._y = y
        self.neighbours = []

    @property
    def x(self):
        return self._x

    @property
    def y(self):
        return self._y

    def __hash__(self):
        return hash((self.x, self.y))

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