python - 如何根据另一个列表列表的值对列表列表进行排序?

标签 python python-3.x sorting

我的两个列表列表是:

lst_1 = [[1, 'John'], [2, 'Mcquin'], [4, 'Paul'], [7, 'Jimmy'], [9, 'Coco'], [11, 'Coco']]
lst_2 = [[3, 'Mcquin', 1], [6, 'Paul', 6], [5, 'John', 15], [12, 'Coco', 18], [8, 'Jimmy', 24], [10, 'Coco', 24]]

根据 lst_2 的子列表中的第二个值对 lst_1 进行排序的最有效方法是什么(lst_2[i][1])? 首选输出:

[[2, 'Mcquin'], [4, 'Paul'], [1, 'John'], [9, 'Coco'], [7, 'Jimmy'], [11, 'Coco']]

如果有重复的同名(在本例中为 Coco)并不重要。此外,列表将始终包含与此处相同的名称。

最佳答案

如果您的两个列表具有相同数量的名称,您可以将每个元素的索引存储在 collections.defaultdict 中,然后弹出每个索引,并在排序过程中找到项目时将其用作排序键。

演示:

from collections import defaultdict, deque

lst_1 = [[1, 'John'], [2, 'Mcquin'], [4, 'Paul'], [7, 'Jimmy'], [9, 'Coco'], [11, 'Coco']]
lst_2 = [[3, 'Mcquin', 1], [6, 'Paul', 6], [5, 'John', 15], [12, 'Coco', 18], [8, 'Jimmy', 24], [10, 'Coco', 24]]

sort_map = defaultdict(deque)
for i, x in enumerate(lst_2):
    sort_map[x[1]].append(i)

result = sorted(lst_1, key=lambda x: sort_map[x[1]].popleft())

print(result)

输出:

[[2, 'Mcquin'], [4, 'Paul'], [1, 'John'], [9, 'Coco'], [7, 'Jimmy'], [11, 'Coco']]. 

注意:您可以使用collections.deque以常数时间从头开始弹出元素,如上所示。这个小的改进让上面的解决方案保持在整体 O(NlogN),这是排序的成本。

关于python - 如何根据另一个列表列表的值对列表列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48805277/

相关文章:

python - 如何获取Python中exec()定义的可调用函数?

Python3 和编码 : different on linux and on OSX?

arrays - 合并排序数组,最佳时间复杂度是多少?

javascript - 使用用户输入对 JavaScript 中的对象数组进行排序

python - 如何设置在 Tkinter Entry 小部件中查看文本结尾?

python - Project Euler Problem #18 Python - 得到错误的结果。为什么?

python - python中的 “object of type int has no length”是什么意思?

Java,按日期排序列表不同类型

具有不同 conda 环境的 Python 任务和 DAG

python - 使用 DataFrame 合并(连接)4 个具有不同 ID 和多个值的不同 CSV 文件