python - 根据条件反转python中的列表

标签 python list sorting

我想以 .log 应该是第一个文件并且 .gz 文件应该按降序排列的方式对这个列表进行排序

my_list = [
     '/abc/a.log.1.gz',
     '/abc/a.log',
     '/abc/a.log.30.gz',
     '/abc/a.log.2.gz',
     '/abc/a.log.5.gz',
     '/abc/a.log.3.gz',
     '/abc/a.log.6.gz',
     '/abc/a.log.4.gz',
     '/abc/a.log.12.gz',
     '/abc/a.log.10.gz',
     '/abc/a.log.8.gz',
     '/abc/a.log.14.gz',
     '/abc/a.log.29.gz'
]

预期结果:

my_list = ['/abc/a.log',
        '/abc/a.log.30.gz',
        '/abc/a.log.29.gz',
        '/abc/a.log.29.gz',
        '/abc/a.log.14.gz',
        '/abc/a.log.12.gz',
        '/abc/a.log.10.gz',
        '/abc/a.log.8.gz',
        '/abc/a.log.6.gz',
        '/abc/a.log.5.gz',
        '/abc/a.log.4.gz',
        '/abc/a.log.3.gz',
        '/abc/a.log.2.gz'
        '/abc/a.log.1.gz']

reversed(mylist) 也没有给我想要的解决方案。

最佳答案

sorted 与自定义 key 函数和 reverse=True 一起使用:

print(sorted(my_list, key=lambda x: (x.endswith('log'), x), reverse=True))
#['/abc/spa/a.log',
# '/abc/spa/a.log.30.gz',
# '/abc/spa/a.log.2.gz',
# '/abc/spa/a.log.1.gz']

根据更新后的问题,您似乎正在尝试对文件名进行排序。我建议使用 os.path 来操作这些字符串。

首先,您可以使用 os.path.splitext 拆分扩展名以比较 .log.gz。然后再剥离扩展名得到文件号,并转换为整数。

例如:

import os

def get_sort_keys(filepath):
    split_file_path = os.path.splitext(filepath)
    sort_key = (split_file_path[1], *os.path.splitext(split_file_path[0]))
    return (sort_key[0], sort_key[1], int(sort_key[2].strip(".")) if sort_key[2] else 0)

print(sorted(my_list, key=get_sort_keys, reverse=True))
#['/abc/a.log',
# '/abc/a.log.30.gz',
# '/abc/a.log.29.gz',
# '/abc/a.log.14.gz',
# '/abc/a.log.12.gz',
# '/abc/a.log.10.gz',
# '/abc/a.log.8.gz',
# '/abc/a.log.6.gz',
# '/abc/a.log.5.gz',
# '/abc/a.log.4.gz',
# '/abc/a.log.3.gz',
# '/abc/a.log.2.gz',
# '/abc/a.log.1.gz']

在这个版本中,我没有像以前那样明确地检查 endswith("log"),但我依赖于 log 扩展将在之后排序的事实gz 字典顺序。

关于python - 根据条件反转python中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54429060/

相关文章:

python - 使用 python 驱动程序在 Neo4j 中创建多个节点的最佳方法

python - 使用字典数据将数据附加到 Pandas 数据框

javascript - 如何在 Vue.js 中使用 ListView ?

c++ - 在列表中寻找值(value)

javascript - 使用键按字母顺序对 Backbone 集合进行排序

java - 递归选择排序中的错误?

python - 在 Docker 中运行的 Aiohttp 和 NGINX

list - 如何打印返回列表的 Perl 表达式的第 n 个元素?

sorting - Doctrine 获取 10 个最新记录,从最旧到最新排序

python - 正则表达式替换匹配项