这里的第一张海报:)
我正在创造一个简单的高尔夫风格的游戏,其中有几个玩家轮流拍摄。每次射门后,重新评估球员队列,以确定接下来是谁。
距离目标最远的玩家接下来。
以下简要介绍了所使用的代码;
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来引用类的定义?
谢谢!
答案 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函数很方便。