[英]Python sort list by 2 parts of the string
因此,我开始学习Python,并且作为第一个项目的一部分,我需要对字符串列表进行排序。 每个字符串如下所示:
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_#NUMBER.file_ext
首先,我想按64进制对列表进行排序,然后按#NUMBER进行排序。 例如,如果我得到一个看起来像这样的列表:
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_0.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe
对其进行排序将给出以下列表:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_0.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe
您可以使用以下内容拆分键的每个条目。 重要的部分是确保末尾的数字按数字而不是字母顺序排序:
def sort_by(x):
h, d = x.split('_')
return (h, int(d.split('.')[0]))
entries = [
"zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe",
"zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_10.exe",
"zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe"]
for entry in sorted(entries, key=sort_by):
print entry
提供以下输出:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_10.exe
您应该使用list.sort()
方法
>>> x = ['zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe',
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe',
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_0.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe']
>>> x.sort()
>>> x
#Output
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_0.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe
您可以尝试这样的事情:
l = ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe',
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_0.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_123.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe']
print(sorted(l, key=lambda x:__import__('re').match('\d*', x).group()))
输出:
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe',
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_0.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe',
'zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_123.exe']
我的解决方案是
find_suffix = re.compile('(.+)(_(\d+)\.\w+)$')
text_list.sort(key = lambda x: (find_suffix.match(x).groups()[0], int(find_suffix.match(x).groups()[2])))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.