Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用类定义中的计算对列表进行排序_Python_Sorting - Fatal编程技术网

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

Python 使用类定义中的计算对列表进行排序,python,sorting,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.posit

第一张海报在这里:)

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

距离目标最远的玩家下一个

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

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))
我一直在关注这个链接 这表明我应该使用一个定义作为排序方法

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


谢谢

您可能正在查找
operator.methodcaller

例如:

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

安迪的回答很好

使用lambda函数是另一种方法

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

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

看起来我有点晚了。为了添加到混合物中:

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))

如前所述,lambda表达式是面包和黄油的抽象,当您需要从任意函数中产生结果时,它使事情变得非常简单。另外,由于您可能希望
turn
列表有一点连续性,因此使用
list.sort()
修改列表<代码>用户。_repr__是为了测试时的清晰性而重新实现的。

查看优先级队列:。它应该更快、更易于使用。请注意,
sorted
返回一个新序列,并且不会修改原始序列。如果您想对列表进行适当排序,请使用
list.sort
。谢谢您的帮助,这很好!谢谢你的快速回复,安迪,我玩了一个游戏,让它工作了。我也喜欢tdihp的解决方案,因为它不需要导入