gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:34:05 24 4
gpt4 key购买 nike

我想以 .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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com