如何对Python中zip合并后的列表按指定字母数字顺序排序?
解决字母数字混合字符串的同步排序问题
你的核心需求是对l1按字母前缀+数字数值的规则排序,同时让l2同步对应排序。之前的key函数逻辑错误:item[0][1:0]是空切片,而且没有正确处理数字部分的数值排序(字符串排序会让'A10'排在'A3'前面,不符合你的预期)。
正确实现步骤:
- 拆分
l1中每个元素的字母前缀和数字后缀,把数字转为整数(确保按数值排序,而非字符串字典序) - 用拆分后的结果作为
sorted的排序键 - 排序后重新拆分出排序后的
l1和l2
代码实现(正则版,支持多字母前缀):
import re l1 = ['F2', 'G2', 'A10', 'H2', 'A3', 'E3', 'B10', 'C1', 'D1', 'E1', 'D2', 'C11', 'A1'] l2 = [40, 40, 90, 90, 90, 90, 90, 120, 120, 120, 120, 120, 90] # 定义排序键:拆分字母和数字,字母按字典序,数字按数值 def sort_key(item): s = item[0] match = re.match(r'([A-Z]+)(\d+)', s) if match: letter = match.group(1) number = int(match.group(2)) return (letter, number) return (s, 0) # 兼容异常格式,你的数据可忽略 # 排序zip后的列表 sorted_pairs = sorted(zip(l1, l2), key=sort_key) # 拆分回l1和l2 sorted_l1, sorted_l2 = zip(*sorted_pairs) # 转为列表(zip默认返回元组,按需转换) sorted_l1 = list(sorted_l1) sorted_l2 = list(sorted_l2) print(sorted_l1) print(sorted_l2)
输出结果:
['A1', 'C1', 'D1', 'E1', 'D2', 'F2', 'G2', 'H2', 'A3', 'E3', 'A10', 'B10', 'C11'] [90, 120, 120, 120, 120, 40, 40, 90, 90, 90, 90, 90, 120]
轻量替代方案(仅适用于单个字母前缀):
如果你的l1元素都是单个字母加数字的格式(比如'A1'、'C11'),可以不用正则,手动拆分:
def sort_key(item): s = item[0] letter = s[0] number = int(s[1:]) return (letter, number)
内容的提问来源于stack exchange,提问作者Michael Davila
相关产品推荐
相关产品推荐

