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

如何参照指定列表对嵌套列表先按国家排序再按元素降序?

按自定义参照列表排序嵌套Python列表的实现

需求说明

现有嵌套列表:

the_list = [[324, 76, "Spain"], [543, 43, "Canada"], [654, 99, "Italy"], [72, 34, "France"],[12, 34, "Italy"],[764, 43, "Spain"],[876, 43, "France"],[732, 22, "Italy"]]

以及自定义排序参照列表:

sorter_list = ["Italy", "Spain", "Canada", "France"]

需要完成双重排序:

  • 优先按sorter_list中的国家顺序分组排列
  • 同一国家组内,按子列表的第二个元素降序排序
    最终要得到:
sorted_list = [[654, 99, "Italy"], [12, 34, "Italy"], [732, 22, "Italy"], [324, 76, "Spain"], [764, 43, "Spain"], [543, 43, "Canada"], [876, 43, "France"], [72, 34, "France"]]

解决方案

核心是把参照列表转换成字典,让国家名称对应到它的优先级索引,这样排序时可以同时结合国家顺序和子列表元素的排序需求。

基础实现代码

from operator import itemgetter

the_list = [[324, 76, "Spain"], [543, 43, "Canada"], [654, 99, "Italy"], [72, 34, "France"],[12, 34, "Italy"],[764, 43, "Spain"],[876, 43, "France"],[732, 22, "Italy"]]
sorter_list = ["Italy", "Spain", "Canada", "France"]

# 生成国家到排序索引的映射字典
country_rank = {country: idx for idx, country in enumerate(sorter_list)}

# 执行排序:先按国家索引升序,再按子列表第二个元素的负值升序(等价于原数值降序)
sorted_list = sorted(the_list, key=lambda x: (country_rank[x[2]], -x[1]))

print(sorted_list)

代码说明

  1. country_rank字典:把sorter_list里的每个国家映射到它的位置序号,比如"Italy"对应0,"Spain"对应1,这样排序时能快速确定每个元素的国家优先级。
  2. 排序key的逻辑:使用元组(country_rank[x[2]], -x[1])作为排序依据:
    • 元组排序会先比较第一个元素,确保国家顺序严格遵循参照列表
    • 第二个元素用-x[1]是因为sorted默认升序,取负值后,原数值大的元素负值更小,会排在前面,刚好实现降序需求。

结合itemgetter的写法

如果习惯用itemgetter,可以这样写(本质逻辑一致):

from operator import itemgetter

country_rank = {country: idx for idx, country in enumerate(sorter_list)}
# 用itemgetter获取子列表的第二个元素,再取负值
sorted_list = sorted(the_list, key=lambda x: (country_rank[x[2]], -itemgetter(1)(x)))

这种写法在子列表元素位置复杂时,可读性会更好,但简单场景下直接用-x[1]更简洁。

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:05:24