如何按含双排序键的嵌套列表对另一列表排序(Python)
按自定义双键列表排序另一个嵌套列表的巧妙方法
你的核心需求是让listB严格遵循order_list里的双键(每个元素的前两个值)顺序来排序,之前的方法之所以失效,是因为sorted会按照你返回的列表本身的比较规则(比如['a',2]自然小于['c',3])来排序,而不是遵循order_list的自定义顺序,而且循环遍历查找的效率也很低(时间复杂度O(n²))。
这里给你一个高效且符合需求的实现思路:先给order_list里的每个双键对分配一个优先级索引,然后用这个索引作为listB元素的排序键,具体步骤如下:
- 构建一个字典,把
order_list中的双键对(转成元组,因为列表不能作为字典键)映射到它在order_list中的位置索引 - 排序
listB时,提取每个元素的前两个值组成元组,查字典得到对应的索引,用这个索引作为排序依据
代码实现
order_list = [['a', 2], ['c', 3], ['b', 1], ['e', 4]] listB = [['c', 3, 'red', 'car'], ['e', 4, 'green', 'bus'], ['b', 1, 'blue', 'bike'], ['a', 2, 'yellow', 'plane']] # 构建双键到索引的映射字典 order_dict = {tuple(item): idx for idx, item in enumerate(order_list)} # 按索引排序listB sorted_listB = sorted(listB, key=lambda x: order_dict[tuple(x[:2])]) print(sorted_listB)
输出结果
[['a', 2, 'yellow', 'plane'], ['c', 3, 'red', 'car'], ['b', 1, 'blue', 'bike'], ['e', 4, 'green', 'bus']]
为什么这个方法更好?
- 效率高:字典的查找是O(1)时间复杂度,整体排序的时间复杂度是O(n log n),比你之前的循环查找快得多
- 逻辑准确:完全遵循
order_list的自定义顺序,不管双键对的自然排序是什么,都能严格匹配 - 符合你的要求:没有把嵌套列表转为单个字符串键,只是将双键转成了元组(这是Python中使用字典键的必要操作,并非改变键的本质结构)
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

