"""任务 5 · sorted 的 key 与 list.sort 的返回值

要看的三件事：

  · sorted(可迭代对象) 返回一个**新**表，原数据不动；key= 指定「按什么比」；
  · 按第二关键字排序：key 交回一个元组，元组按字典式顺序比（先比第一项，相同再比第二项）；
    分数要降序、编号要升序，所以第一项取负号、编号放第二项；
  · list.sort() 原地改，并且返回 None —— 写成 x = a.sort()，接住的其实是 None。

带 print 的行是判分接口，别改；要写的是标着 TODO 的那几行（现在都是占位值）。

跑： py task5_sort.py
判： py run_tests.py
"""

records = [('A03', 80), ('A01', 95), ('A02', 80), ('A04', 95)]     # 别改
snapshot = [('A03', 80), ('A01', 95), ('A02', 80), ('A04', 95)]    # 别改：原始顺序的快照


# ══ TODO 01 ═════════════════════════════════════════════════
# 排行榜：分数从高到低；分数相同的，编号从小到大。
# 提示：key 交回一个元组 (第一关键字, 第二关键字)；分数降序要靠第一项取负号。
#       另一条路也行：先按次要键排一遍、再按主要键排一遍（排序是稳定的）。
def rank_key(rec):
    return 0


board = None
print('01 排行榜', board)                 # 别改：期望 [('A01', 95), ('A04', 95), ('A02', 80), ('A03', 80)]
print('02 原记录没动', records == snapshot)  # 别改：期望 True


# ══ TODO 02 ═════════════════════════════════════════════════
# 这一行要拿到「降序排好的新表」，而 scores 本身保持原样。
# 提示：列表排序有两个写法，只有一个会返回新表。
scores = [88, 95, 70]                     # 别改
ranked = None
print('03 sorted 新表', ranked)            # 别改：期望 [95, 88, 70]
print('04 原分数没动', scores)              # 别改：期望 [88, 95, 70]


# ══ TODO 03 ═════════════════════════════════════════════════
# 这里要**真的**调用一次原地排序，并把它的返回值接住。
# 提示：接住之后你会发现它不是表（打印出来看看它是什么）；trap 自己会被排好。
trap = [88, 95, 70]                       # 别改
none_value = 0
print('05 sort 的返回值是 None', none_value is None)   # 别改：期望 True
print('06 被 sort 改过的原表', trap)        # 别改：期望 [70, 88, 95]


# ══ TODO 04 ═════════════════════════════════════════════════
# 用给好的 count_key 当排序依据（它会数自己被调用几次）：按分数升序排一遍。
key_calls = 0                             # 别改


def count_key(rec):
    """会数自己被调用几次的键函数（别改）。"""
    global key_calls
    key_calls += 1
    return rec[1]


by_score = None
print('07 按分数升序', by_score)            # 别改：期望 [('A03', 80), ('A02', 80), ('A01', 95), ('A04', 95)]
print('08 取键次数', key_calls)             # 别改：期望 4（键函数每条记录只调用一次）
