使用类定义

时间:2015-05-29 03:34:10

标签: python sorting

这里的第一张海报:)

我正在创造一个简单的高尔夫风格的游戏,其中有几个玩家轮流拍摄。每次射门后,重新评估球员队列,以确定接下来是谁。

距离目标最远的玩家接下来。

以下简要介绍了所使用的代码;

class User:
    def __init__(self):
        self.position = (0.0, 0.0)

    def distance_to_goal(self, goal_coord):
        ax = ((goal_coord[0] - self.position[0]) ** 2)
        bx = ((goal_coord[1] - self.position[1]) ** 2)
        return math.sqrt(ax + bx)

Player1 = User() #(same for Player2, Player3)
TheGame.turn = [Player1, Player2, Player3]
TheGame.hole.goal_position = (0.0, 40.0)

在玩家开枪并且他们的位置移动后,我想重新排序列表。我尝试了以下两个但没有奏效:

sorted(TheGame.turn, key = distance_to_goal(TheGame.hole.goal_position))
sorted(TheGame.turn, key = TheGame.turn.distance_to_goal(TheGame.hole.goal_position))

我关注此链接http://www.thegeekstuff.com/2014/06/python-sorted/ 这表明我应该使用定义作为排序方法。

这有效,但我想知道是否有一种方法可以使用sort来引用类的定义?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可能正在寻找operator.methodcaller

例如:

import operator
sorted(TheGame.turn, key=operator.methodcaller('distance_to_goal', TheGame.hole.goal_position))

https://docs.python.org/2/library/operator.html#operator.methodcaller

答案 1 :(得分:1)

好像我有点晚了。为了增加混音:

import math


class User:
    def __init__(self, name='', position=(0.0, 0.0)):
        self.name = name
        self.position = position

    def distance_to_goal(self, goal_coord):
        ax = ((goal_coord[0] - self.position[0]) ** 2)
        bx = ((goal_coord[1] - self.position[1]) ** 2)
        return math.sqrt(ax + bx)

    def __repr__(self):
        return str([self.name, self.position])


class Hole:
    def __init__(self):
        self.goal_position = (0.0, 0.0)


class Game:
    def __init__(self):
        self.turn = []
        self.hole = Hole()

Player1 = User('Alice', (135.3, 9.0))
Player2 = User('Bob', (7.6, 85.4))
Player3 = User('Clem', (92.4, 43.1))
TheGame = Game()
TheGame.turn = [Player1, Player2, Player3]
TheGame.hole.goal_position = (0.0, 40.0)

print(TheGame.turn)
TheGame.turn.sort(key=lambda user: user.distance_to_goal(TheGame.hole.goal_position))
print([p.distance_to_goal(TheGame.hole.goal_position) for p in TheGame.turn])
print('{0} is closest to the hole!'.format(TheGame.turn[0].name))

正如tdhip所述,lambda表达式是面包和黄油的抽象,当你需要从任意函数中产生时,它会让事情变得异常简单。此外,由于您可能希望turn列表具有一定的连续性,因此list.sort()用于就地修改列表。在测试时,为了清楚起见,重新实现了User.__repr__

答案 2 :(得分:0)

@Andy的答案很好。

使用lambda函数是另一种方式。

sorted(TheGame.turn, key=lambda user: user.distance_to_goal(TheGame.hole.goal_position))

当事情变得比仅仅方法调用更复杂时,Lambda函数很方便。