我的两个列表列表是:
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/