Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
何时使用sorted()和.sort()
你已经看到了sorted()和.sort()之间的区别,但是什么时候该用哪一个呢?
让我来说一下,有一个5k比赛即将到来:第一届年度Python 5k。需要捕获并排序来自比赛的数据。需要捕获的数据是跑步者的号码和完成比赛所需的秒数:
当参赛者跨过终点线时,每一个Runner都会被加入一个名为runners的列表当中。在5k比赛中,并不是所有的运动员都同时跨过起跑线,所以第一个越过终点线的人可能并不是最快的:
每一次一个跑步者跨过终点线,他们的号码以及耗时(以秒为单位)都会被加入到runners列表当中。
现在,负责处理结果数据的程序员看到了这个列表,知道了前5名最快的选手是获奖者,其余的参赛者将按时间排序。
不需要根据不同的属性进行多种类型的排序。这个列表的大小是合理的。没有提到将列表存储在某个地方。只需要按时间排序,找出耗时最短的5名选手:
编程人员选择在参数key上使用lambda函数,以便从每一个runner中获取它们的持续时间属性,并且使用.sort()对runners列表进行排序。在runners列表完成排序之后,前5个元素被存储在top_five_runners列表中。
任务完成!比赛总监过来告诉程序员,由于Python的当前版本是3.7,所以他们决定每37名冲过终点线的人将获得一个免费的健身包。
此时,程序员开始感到很苦恼,因为runners列表已经不可逆转地更改了,没有办法恢复原始的runners列表的顺序,并找到每37人。
如果您正在处理重要的数据,即使这些原始数据需要恢复的可能性很小,那么.sort()也不是最佳选项。如果数据是副本,如果它是不重要的工作数据,如果没有人介意丢失它,因为它可以被找回,那么.sort()是一个不错的选择。
或者,runners列表可以使用sorted()函数排序,并且使用相同的lambda表达式:
在使用sorted()函数的这个方案中,原始的runners列表仍然是完整的,没有被覆盖。通过与原始值的交互,可以实现每隔37人到达终点线的临时性要求:
every_thirtyseventh_runners列表是对runners列表使用列表切片语法创建的,它仍然包含跑步者越过终点线的原始顺序。
怎样使用Python排序:结论
.sort()和sorted()可以提供所需的排序顺序,如果你正确地将它们与可选的关键字参数reverse和key一起使用的话。
当涉及到输出和修改数据时,两者具有非常不同的特性,因此请确保您仔细考虑过将使用.sort()的任何应用功能或程序,因为它会不可逆转地覆盖数据。
对于热心寻找排序方面的挑战的Python高手来说,可以尝试在排序中使用更复杂的数据类型:嵌套迭代器。英文原文:https://realpython.com/python-sort/
译者:Lyx