Python 现代开发学习笔记

(十五)排序与比较依据

1. 新结果与原地修改

# sorted 读取数据并返回一个新的有序列表。
values = [35, 20, 45, 20]
ordered = sorted(values)
print(values, ordered)
# sort 修改列表本身;reverse=True 选择降序。
result = values.sort(reverse=True)
print(values, result)

输出:

[35, 20, 45, 20] [20, 20, 35, 45]
[45, 35, 20, 20] None

sort 与 append 一样,主要动作是修改原列表,返回 None。若要保留原来的输入顺序,就把新排序结果保存在另一个名称中。

2. 用 key 指定排序依据

# len 作为计算比较键的工具传给 key,没有在这里加括号调用。
titles = ["Python", "NumPy", "Flask", "Django"]
ordered = sorted(titles, key=len)
print(ordered)

输出 ['NumPy', 'Flask', 'Python', 'Django']。先为各项计算长度 6、5、5、6,再按这些键排序。长度相同时保留输入中的相对次序:NumPy 仍在 Flask 前,Python 仍在 Django 前。这叫排序的稳定性。

多个比较条件可以组织成元组,元组按从左到右的第一个不同项决定顺序:

# 先比较第一项时长;时长相同,再比较第二项书名。
records = [(30, "Python"), (20, "NumPy"), (30, "Flask")]
print(sorted(records))
# 想按时长降序、书名升序,可以把时长取负作为第一项。
keys = [(-minutes, title) for minutes, title in records]
for negative_minutes, title in sorted(keys):
    print(-negative_minutes, title)

key=len 与 map(int, ...) 都是把一个现成动作交给另一个工具。后面学习函数与 lambda,会把更具体的比较规则直接写成函数;这里先使用已经能解释的工具和元组比较。

笔记正文与全部题解 · Ctrl / ⌘ K