使用类定义中的计算对列表进行排序

2024-04-29 01:44:59 发布

您现在位置:Python中文网/ 问答频道 /正文

第一张海报:)

我正在创建一个简单的高尔夫风格的游戏,几个球员轮流投篮。在每一次射击之后,玩家的队列被重新评估,以知道下一个轮到谁了。你知道吗

离目标最远的玩家下一个。你知道吗

下面对所使用的代码进行了简化

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来引用类的定义?你知道吗

谢谢!你知道吗


Tags: to方法self玩家positionturndistancesorted
3条回答

@安迪的回答很好。你知道吗

使用lambda函数是另一种方法。你知道吗

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

当事情变得比方法调用更复杂时,Lambda函数非常方便。你知道吗

你可能在找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

我好像有点晚了。为了添加到混合物中:

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__是为了测试时的清晰性而重新实现的。你知道吗

相关问题 更多 >