在Python中排序物件

2024-10-01 00:20:26 发布

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

我想用对象的一个属性对它们进行排序。到目前为止,我将按照以下方式来做

USpeople.sort(key=lambda person: person.utility[chosenCar],reverse=True)

这个很好,但是我读过运算符.attrgetter()可能是实现这一目标的更快方法。首先,这是正确的吗?假设它是正确的,我如何使用运算符.attrgetter()来实现这一目标?在

我试过了

^{pr2}$

但是,我得到一个错误,说没有属性'utility[chosenCar]'。在

问题是我要排序的属性在字典中。例如,“工具”属性的格式如下:

utility={chosenCar:25000,anotherCar:24000,yetAnotherCar:24500}

我想按chosenCar的用途分类运算符.attrgetter(). 我怎么能这么做?在

提前谢谢。在


Tags: 对象lambdakey目标属性排序方式运算符
3条回答

要访问chosenCar项,您必须使用:

>>> P.utility={'chosenCar':25000,'anotherCar':24000,'yetAnotherCar':24500}
>>> operator.itemgetter('chosenCar')(operator.attrgetter('utility')(P))
25000

对于key函数,您必须执行以下操作:

^{pr2}$

然而,你关于这种方法更好的性能的主要主张似乎研究得不充分。我建议使用^{}模块来测试这两种方法对您自己的数据的性能。在

不,attrgetter不会比lambda快——它实际上只是做同样事情的另一种方式。在

您可能对使用key而不是cmp的建议感到困惑,这确实快得多,但您已经这样做了。在

  • 永远不要,永远不要基于你读过的东西进行优化。进入你的代码,从你所拥有的随机改变到你认为应该更快的东西,这不是一个有效的优化策略。

  • 如果你想改进你的代码,这里是如何优化的。在

    1. 别这样。这常常是浪费时间。在
    2. 做一个有效的,可测试的程序。在
    3. 确定性能指标能够回答“这段代码够快吗?”在
    4. 意识到你的代码已经足够快了。在
    5. 如果您无法执行步骤(4),请分析代码的实际输入,以确定它在哪里花费时间。在Python中,可以使用http://docs.python.org/library/profile.html来完成此操作。瓶颈发生在意想不到的地方,这将告诉您实际需要付出的努力。在
    6. 检查算法次优性的耗时代码。这种情况有时会发生在你所处的级别,但也经常发生在几个级别之外。改进算法几乎总是加速的最大机会。在
    7. 如果你不能改进你的算法,测试不同的代码片段做同样的事情为基础,看看他们如何执行。使用http://docs.python.org/library/timeit.html测试代码段(这比人们意识到的要难,所以要小心)并重新运行性能测试和配置文件。在

      尝试提前做这一步是很诱人的,但这往往是徒劳的。你需要知道你正在优化的东西是有意义的。

    我希望这能提供一些关于如何加速代码(以及何时不需要麻烦)的见解。我见过很多人尝试用经验法则优化来代替随机代码,但我还没见过那些人开发出好的、快速的软件。优化必须科学地进行,使用理论(如6中的计算机科学)和实验(如7中的时间安排)。

  • 在这种情况下,我敢打赌SilentGhost的代码最终会比你的慢。我当然不确定,但你也不知道,除非你确定时间。在

    (我不认为你应该费心去计时,我认为你应该采用最清晰的方法,你最初的方法。)

相关问题 更多 >