我想以.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'
]
expected_result:
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)
也没有给我想要的解决方案。
答案 0 :(得分:9)
将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
之后的事实。
答案 1 :(得分:2)
如果有多个扩展名,则在字典中分配等级以具有更大的灵活性
my_list = ['/abc/spa/a.log.1.gz',
'/abc/spa/a.log',
'/abc/spa/a.log.30.tar',
'/abc/spa/a.log.30.gz',
'/abc/spa/a.log.2.gz']
rank={'log':1,'gz':2,'tar':3} # 'tar' is optional here
sorted(my_list,key = lambda x : (-rank.get(x.rsplit('.')[-1],0), 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',
'/abc/spa/a.log.30.tar']
关于您的最新问题
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'
]
rank={'log':1,'gz':2,'tar':3} # 'tar' is optional here
sorted(my_list,key = lambda x : (-rank.get(x.rsplit('.',1)[-1]), int(x.split('.')[-2]) if x.split('.')[-2].isdigit() else 0),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']