2016-09-29 91 views
2

我有文件名的形式列表:數控訂購基於圖案列表

['comm_1_1.txt', 'comm_1_10.txt', 'comm_1_11.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt'] 

我不知道如何將這個列表數值排序,以獲得輸出:

['comm_1_1.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt', 'comm_1_10.txt', 'comm_1_11.txt'] 

回答

3

你應該分裂所需號碼,並將其轉換爲int

ss = ['comm_1_1.txt', 'comm_1_10.txt', 'comm_1_11.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt'] 

def numeric(i): 
    return tuple(map(int, i.replace('.txt', '').split('_')[1:])) 

sorted(ss, key=numeric) 
# ['comm_1_1.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt', 'comm_1_10.txt', 'comm_1_11.txt'] 
1

我真的不認爲這是一個最好的答案,但你可以 試試看。用於這種「人排序」的

l = ['comm_1_1.txt', 'comm_1_10.txt', 'comm_1_11.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt'] 

d = {} 

for i in l: 
    filen = i.split('.') 
    key = filen[0].split('_') 
    d[int(key[2])] = i 

for key in sorted(d): 
     print(d[key]) 
2

的一種技術是鍵分裂到元組和轉換數字部分實際數字:

ss = ['comm_1_1.txt', 'comm_1_10.txt', 'comm_1_11.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt'] 

print(sorted(ss, key=lambda x : map((lambda v: int(v) if "0" <= v[0] <= "9" else v), re.findall("[0-9]+|[^0-9]+", x)))) 

,或者更可讀

def sortval(x): 
    if "0" <= x <= "9": 
     return int(x) 
    else: 
     return x 

def human_sort_key(x): 
    return map(sortval, re.findall("[0-9]+|[^0-9]+", x)) 

print sorted(ss, key=human_sort_key) 

該想法是將數字部分和非數字部分分開,並在將數字部分轉換爲實際數字後將這些部分放入列表中(以便10在之後)。

按字母順序排列列表給出了預期的結果。