如何按list1的名称顺序对list2排序?两列表含相同名称元素
把list2排序成和list1名称一致的顺序
这事儿好办,给你两种灵活的实现方式,不管list2初始顺序怎么乱,只要名称和list1完全匹配,就能精准对齐:
方法一:字典映射法(高效首选)
先从list1里生成一个名称到索引的字典,这样就能快速定位每个名称在list1中的位置,然后用这个位置作为排序依据来整理list2。代码示例:
list1 = [ ["name1", 100], ["name2", 33], ["name3", 22]] list2 = [ ["name2", 1], ["name1", -1], ["name3", 0]] # 构建名称到list1索引的映射字典 name_position = {name: idx for idx, (name, _) in enumerate(list1)} # 按照list1的顺序排序list2 sorted_list2 = sorted(list2, key=lambda item: name_position[item[0]]) print(sorted_list2) # 输出结果:[["name1", -1], ["name2", 1], ["name3", 0]]
这种方法的好处是效率高,构建字典是O(n)时间,排序是O(n log n),哪怕列表元素再多(远超过20个)也能稳定运行;而且逻辑清晰,别人看代码也能一眼明白是按list1的顺序来排的。
方法二:直接利用名称序列(代码更简洁)
如果觉得字典有点麻烦,也可以直接提取list1的名称列表,用index()方法获取每个名称的位置来排序:
list1 = [ ["name1", 100], ["name2", 33], ["name3", 22]] list2 = [ ["name2", 1], ["name1", -1], ["name3", 0]] # 提取list1的名称顺序 name_order = [name for name, _ in list1] # 按名称在name_order中的位置排序 sorted_list2 = sorted(list2, key=lambda item: name_order.index(item[0])) print(sorted_list2) # 输出和上面完全一致
这种写法更简洁,但要注意:index()每次查找是O(n)时间,所以整体时间复杂度是O(n²)。不过你的场景里最多20个元素,这点性能差异完全可以忽略,怎么顺手怎么来就行。
两种方法都能完美满足你的需求,根据自己的习惯选就好啦~
内容的提问来源于stack exchange,提问作者FlugtN
相关产品推荐
相关产品推荐

