Python列表排序前,先决定是否修改原数据
给数据排序,看起来只是把顺序调整一下,但在程序里还需要先明确一个问题:原来的列表是否应该被修改。这个选择会影响后续处理,也会影响同时使用这份数据的其他代码。
Python 中,列表的 sort 方法会直接调整当前列表的顺序。假设列表最初依次保存 3、1、2,完成默认升序排序后,同一个列表里的顺序变成 1、2、3。如果另一个变量也指向这个列表,通过那个变量观察到的顺序同样会变化。变量名称不同,并不代表它们持有不同的列表。
与之相比,sorted 会返回一个新的排序结果列表。对上述数字列表调用 sorted 后,可以得到 1、2、3,同时保留原列表的 3、1、2。若后面还需要原始输入顺序,例如展示用户导入时的排列或比较处理前后的结果,这种方式通常更容易表达意图。
返回值也需要注意。列表的 sort 方法成功完成时返回 None,而不是返回排好序的列表。如果把调用结果重新赋给原变量,原变量就会指向 None。需要继续使用原列表时,应把排序操作和使用列表分开;需要一个新结果时,则可以接收 sorted 的返回值。
排序规则应与业务含义对应。数字可以按数值排序,记录可以按某个字段排序。使用 key 指定提取规则,可以把“比较哪个字段”与记录本身分开。例如,按记录中的分值排序,并不要求把整条记录都转换成字符串进行比较。降序排列也应通过明确的排序参数表达,便于读者理解。
相同排序键的记录,还涉及稳定性。Python 的排序是稳定的,也就是排序键相等时,会保留这些记录原有的相对顺序。本次样例中,A 和 C 的分值同为 2,B 的分值为 1;按分值升序排列后得到 B、A、C,A 仍然位于 C 之前。稳定排序并不会自动补充业务上的第二排序条件,如有需要仍应明确指定。
新列表也不代表把所有内容都深度复制了一遍。若列表元素本身是可变对象,sorted 返回的新列表仍可能引用原来的那些对象。因此,只想调整展示顺序,与希望得到一份完全独立、可以任意修改的嵌套数据,是两种不同需求。选择排序方式时,也要考虑元素是否会在后续被修改。
本次实际验证了新结果保留原列表、原地排序的返回值与共享引用、降序排列、相同键的稳定性,以及嵌套元素引用这五组场景,均通过断言。实际使用时,先说明是否允许修改输入,再定义排序键和相同键的处理规则,往往比只关注排序后的数字更有用。
- 点赞
- 收藏
- 关注作者
评论(0)