如何基于参考列表中的子串对Python列表进行排序
按参考列表的顺序排序字符串列表
问题背景
现有两个列表:
list_a = ['Grapes/testfile.csv','Apples/testfile.csv','Pears/testfile.csv','Pears/testfile2.csv'] ref_list = ['Pears','Grapes','Apples']
需要严格按照ref_list的顺序对list_a排序,要求:
list_a中每个元素的/前缀必然来自ref_list- 不使用字母顺序排序,完全遵循
ref_list的优先级 ref_list与list_a长度不匹配
期望输出:
ordered_list = ['Pears/testfile.csv','Pears/testfile2.csv','Grapes/testfile.csv','Apples/testfile.csv']
用户尝试的无效代码:
ordered_list = sorted(list_a, key = lambda x: x.startswith())
解决方案
高效实现(推荐)
先将ref_list转换为字典,用元素作为键、索引作为值,快速查找前缀对应的排序权重:
# 构建参考字典,映射元素到其索引位置 ref_dict = {item: idx for idx, item in enumerate(ref_list)} # 按前缀在参考列表中的索引排序 ordered_list = sorted(list_a, key=lambda x: ref_dict[x.split('/')[0]])
简洁实现(适合小列表)
如果ref_list元素数量较少,也可以直接用list.index()方法获取前缀的索引:
ordered_list = sorted(list_a, key=lambda x: ref_list.index(x.split('/')[0]))
代码解释
x.split('/')[0]:将list_a中的每个字符串按/分割,提取出前缀部分(如'Pears/testfile.csv'提取为'Pears')- 排序key的核心是获取该前缀在
ref_list中的索引位置:索引越小的前缀,对应的元素排序越靠前 - Python的
sorted是稳定排序,相同前缀的元素会保持它们在原列表中的相对顺序
内容的提问来源于stack exchange,提问作者James Cook
相关产品推荐
相关产品推荐

