如何实现Python列表双条件排序:扩展名升序(txt优先)、文件名降序
多条件排序:扩展名升序+文件名降序
需求:对文件列表按两个规则排序:
- 优先按文件扩展名升序(txt格式排在csv前面,忽略大小写)
- 扩展名相同时,按文件名降序(忽略大小写)
输入列表:
lst = ["d.csv", "a.TXT", "b.txt", "c.csv"]
期望输出:
lst = ["b.txt", "a.TXT", "d.csv", "c.csv"]
现有示例代码使用默认升序逻辑,无法单独为文件名条件设置降序,达不到需求:
sorted(lst, key = lambda x:(x.split(".")[-1].lower(), x.split(".")[0].lower()))
解决方案
方案1:利用排序稳定性分两次排序
Python的排序是稳定排序——当两个元素的排序key相同时,会保留它们在原序列中的相对顺序。我们可以先按次要条件(文件名降序)排序,再按主要条件(扩展名升序)排序:
lst = ["d.csv", "a.TXT", "b.txt", "c.csv"] # 第一步:按文件名小写降序排序(次要条件) temp_sorted = sorted(lst, key=lambda x: x.split(".")[0].lower(), reverse=True) # 第二步:按扩展名小写升序排序(主要条件,稳定排序会保留文件名的降序顺序) final_sorted = sorted(temp_sorted, key=lambda x: x.split(".")[-1].lower()) print(final_sorted) # 输出: ['b.txt', 'a.TXT', 'd.csv', 'c.csv']
方案2:在key中反向处理文件名
因为字符串无法直接通过取负实现降序,我们可以将文件名反转,让升序排序等价于原文件名的降序,这样一次sorted调用就能完成:
lst = ["d.csv", "a.TXT", "b.txt", "c.csv"] final_sorted = sorted(lst, key=lambda x: ( x.split(".")[-1].lower(), # 主要条件:扩展名小写升序 x.split(".")[0].lower()[::-1] # 次要条件:反转文件名后升序 = 原文件名降序 )) print(final_sorted) # 输出符合预期
内容的提问来源于stack exchange,提问作者skolukmar
相关产品推荐
相关产品推荐

