如何按首元素数字优先、字母次之规则排序zip后的元组?
问题:按元组首元素的特定规则排序
我将两个列表执行zip操作后,想要按元组首元素的A1、B1、C1顺序(即先按数字部分升序,同一数字下按字母升序)排序。相关数据如下:
l1 = ['F2', 'G2', 'B2', 'H2', 'A3', 'E3', 'G3', 'C1', 'D1', 'E1', 'D2', 'C3', 'A1'] l2 = [40, 40, 90, 90, 90, 90, 90, 120, 120, 120, 120, 120, 90]
当前使用的代码:
l1, l2 = [list(i) for i in zip(*sorted(zip(l1, l2), key=lambda x: list(map(int,x[0][1:]))))] print(l1) print(l2)
当前输出:
['C1', 'D1', 'E1', 'A1', 'F2', 'G2', 'B2', 'H2', 'D2', 'A3', 'E3', 'G3', 'C3'] [120, 120, 120, 90, 40, 40, 90, 90, 120, 90, 90, 90, 120]
预期的l1排序结果:
['A1', 'C1', 'D1', 'E1', 'B2', 'D2', 'F2', 'G2', 'H2', 'A3', 'C3', 'E3', 'G3']
请问如何修改代码以得到预期的排序结果?
解决方案
问题出在当前排序的key只提取了字符串的数字部分,完全没考虑字母排序规则,导致同一数字组内的元素顺序混乱。
修改核心是让排序key返回一个元组:第一个元素是数字部分的整数,第二个元素是字母部分的字符。这样Python会先按数字升序排序,数字相同的情况下再按字母升序排序,完全符合需求。
修改后的代码:
# 合并两个列表并按规则排序 sorted_pairs = sorted(zip(l1, l2), key=lambda x: (int(x[0][1:]), x[0][0])) # 拆分回两个独立列表 l1_sorted, l2_sorted = zip(*sorted_pairs) # 转成列表(可选,zip返回的是元组,若需可修改操作则转换) l1_sorted = list(l1_sorted) l2_sorted = list(l2_sorted) print(l1_sorted) print(l2_sorted)
运行结果:
['A1', 'C1', 'D1', 'E1', 'B2', 'D2', 'F2', 'G2', 'H2', 'A3', 'C3', 'E3', 'G3'] [90, 120, 120, 120, 90, 120, 40, 40, 90, 90, 120, 90, 90]
补充说明
- 原代码中
list(map(int,x[0][1:]))属于冗余操作:x[0][1:]是单个数字字符串(比如"1"),直接用int()转换即可,无需map和list。 - 元组作为排序key时,Python会按元素顺序依次比较,这是实现多条件排序的常用技巧。
内容的提问来源于stack exchange,提问作者Michael Davila
相关产品推荐
相关产品推荐

