2015-05-29 65 views
2

我有一個Python文件名列表如下:[name1, name10, name11, name2, name3, ..., name9]python自定義排序列表1/2/3 /../ 9/10

我想要它被排序像[name1, name2, name3, ..., name10, name11]

我該怎麼做?

我知道我可以使用特殊的按鍵功能(sorted(files, key=lambda name: etc.)),但我不確定要應用哪個功能。

感謝您的幫助!

+1

重複: 「不會的Python有內建的功能,用於串自然排序」 http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort – DeepSpace

+2

你在名稱中有不一致的空格,它們是正確的嗎? –

+0

對不起我的壞。它現在更新了。 – beta

回答

2

如果你正在尋找一個lambda表達式與sorted功能使用,並且知道你的條目的形式的「nameXXXXX」:

sorted(names, key=lambda name: int(name[4:])) 
+0

該死的。你打敗了我;)謝謝! – beta

+1

不錯!那麼,這是最簡單的解決方案,如果你確切知道你會處理什麼樣的價值 –

+0

但是這個一般不會工作。就像一個包含Namea而不是Name的元素一樣。查看下面的文章以獲得通用解決方案。 – csharpcoder

2
import re 

l = ["name1", "name10", "name 11", "name2"] 
convert = lambda text: int(text) if text.isdigit() else text.lower() 
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
print sorted(l, key = alphanum_key) 

輸出:['name1', 'name2', 'name10', 'name 11']

+0

你可以使用'findall'安裝split。 –

1

我認爲我知道了。 給出一個列表[name1, name10, name11, name2, name3, ..., name9]

sorted(list, key = lambda name: int(name[4:])) 

這條4字符,因爲name4字符,然後通過各種各樣的剩餘數量。

3

嘗試使用第三方庫自然字符串排序調用natsort

>>> import natsort 
>>> my_list = [...] 
>>> natsort.natsorted(my_list) 

您也可以使用key參數指定排序鍵。

>>> natsort.natsorted(my_list, key=lambda x: ...) 
3

試試這個:

sorted(aList, key= lambda x: (lambda a, _, b: (a, int(b)) if b.isdigit() else (float("inf"), x))(*x.partition(" "))) 

這將工作按您的要求。它也不需要任何第三方庫。

1

這是做這項工作的代碼的一個例子。這不是最優的,但它很容易理解,並讓您深入瞭解此特定排序問題的解決方案背後的邏輯。

mylist = ['name1', 'name2', 'name3', 'name10', 'name11'] 
sorted_list = [] 

for n in range(100): #this gives you the order 
    for item in mylist: 
     if int(item[4:]) == n: 
      sorted_list.append(item) 

print(sorted_list) 

這將輸出:

['name1', 'name2', 'name3', 'name10', 'name11']