簡體   English   中英

Python按字符串的2部分排序列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM