You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按首元素数字优先、字母次之规则排序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:04:51