# 使用sort()对列表进行原地排序会修改原列表
# 要想对列表进行排序同时又不修改原列表,可以先复制列表
1 unordered_list = [3, 5, 1, 7, 2, 8, 4, 9, 0, 6] 2 print("Output #88: {}".format(unordered_list)) 3 list_copy = unordered_list[:] 4 list_copy.sort() 5 print("Output #89: {}".format(list_copy)) 6 print("Output #90: {}".format(unordered_list))
这个示例展示了使用 sort 函数以 in-place 方式对列表进行排序的方法。和 reverse 函
数一样,这种原地排序将原列表修改为排好顺序的新列表。要想使用排好顺序的列表而
不修改原列表,可以先复制列表,然后对列表副本进行 sort 操作。
10. sorted 排序函数
# 使用sorted()对一个列表集合按照列表中某个位置的元素进行排序
my_lists = [[1,2,3,4], [4,3,2,1], [2,4,1,3]] my_lists_sorted_by_index_3 = sorted(my_lists, key=lambda index_value:index_value[3]) print("Output #91: {}".format(my_lists_sorted_by_index_3))
这个示例展示了如何使用 sorted 函数以及关键字函数,对一个列表集合按照每个列表
中特定索引位置的值进行排序。关键字函数设置用于列表排序的关键字。在这个示例中,
关键字是一个 lambda 函数,表示使用索引位置为 3 的值(也就是列表中的第四个元素)
对列表进行排序。(后续章节将会对 lambda 函数做更多讨论。)使用每个列表中的第四
个元素作为排序关键字,应用 sorted 函数之后,第二个列表 [4, 3, 2, 1] 成为了第
一个列表,第三个列表 [2, 4, 1, 3] 成为了第二个列表,第一个列表 [1, 2, 3,
4] 成为了第三个列表。另外,你应该知道 sorted 函数的排序与 sort 函数的 in-place
原地排序方式不同,sort 函数改变了原列表的元素顺序,sorted 函数则返回一个新的
排好序的列表,并不改变原列表的元素顺序。
下一个排序示例使用 operator 标准模块,这个模块提供的功能可以使用多个关键字对
列表、元组和字典进行排序。为了在脚本中使用 operator 模块中的 itemgetter 函
数,在脚本上方添加 from operator import itemgetter :
1 #!/usr/bin/env python3 2 from math import exp, log, sqrt 3 import re 4 from datetime import date, time, datetime, timedelta 5 from operator import itemgetter
导入 operator 模块中的 itemgetter 函数后,你可以使用每个列表中多个索引位置
的值对列表集合进行排序:
# 使用itemgetter()对一个列表集合按照两个索引位置来排序
1 my_lists = [[123,2,2,444], [22,6,6,444], [354,4,4,678], [236,5,5,678], [578,1,1,290], [461,1,1,290]] 2 my_lists_sorted_by_index_3_and_0 = sorted(my_lists, key=itemgetter(3,0)) 3 print("Output #92: {}".format(my_lists_sorted_by_index_3_and_0))
这个示例展示了如何使用 sorted() 函数和 itemgetter 函数按照每个列表中多个索
引位置的值对列表集合进行排序。关键字函数设置用于列表排序的关键字。在这个示例
中,关键字是包含两个索引值(3 和 0)的 itemgetter 函数。这个语句的意义是:“先按
照索引位置 3 中的值对列表进行排序,然后,在这个排序基础上,按照索引位置 0 中的值
对列表进一步排序。”
这种通过多个元素对列表和其他数据容器进行排序的方法非常重要,因为你