我有一個Python文件名列表如下:[name1, name10, name11, name2, name3, ..., name9]
。python自定義排序列表1/2/3 /../ 9/10
我想要它被排序像[name1, name2, name3, ..., name10, name11]
。
我該怎麼做?
我知道我可以使用特殊的按鍵功能(sorted(files, key=lambda name: etc.)
),但我不確定要應用哪個功能。
感謝您的幫助!
我有一個Python文件名列表如下:[name1, name10, name11, name2, name3, ..., name9]
。python自定義排序列表1/2/3 /../ 9/10
我想要它被排序像[name1, name2, name3, ..., name10, name11]
。
我該怎麼做?
我知道我可以使用特殊的按鍵功能(sorted(files, key=lambda name: etc.)
),但我不確定要應用哪個功能。
感謝您的幫助!
如果你正在尋找一個lambda表達式與sorted
功能使用,並且知道你的條目的形式的「nameXXXXX」:
sorted(names, key=lambda name: int(name[4:]))
該死的。你打敗了我;)謝謝! – beta
不錯!那麼,這是最簡單的解決方案,如果你確切知道你會處理什麼樣的價值 –
但是這個一般不會工作。就像一個包含Namea而不是Name的元素一樣。查看下面的文章以獲得通用解決方案。 – csharpcoder
你要搜索的是The alphanum algorithm(有時也稱爲自然分類)。我鏈接的站點有多種語言的實現,即使在python中也有一個。
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']
你可以使用'findall'安裝split。 –
我認爲我知道了。 給出一個列表[name1, name10, name11, name2, name3, ..., name9]
sorted(list, key = lambda name: int(name[4:]))
這條4
字符,因爲name
長4
字符,然後通過各種各樣的剩餘數量。
嘗試使用第三方庫自然字符串排序調用natsort
。
>>> import natsort
>>> my_list = [...]
>>> natsort.natsorted(my_list)
您也可以使用key
參數指定排序鍵。
>>> natsort.natsorted(my_list, key=lambda x: ...)
試試這個:
sorted(aList, key= lambda x: (lambda a, _, b: (a, int(b)) if b.isdigit() else (float("inf"), x))(*x.partition(" ")))
這將工作按您的要求。它也不需要任何第三方庫。
這是做這項工作的代碼的一個例子。這不是最優的,但它很容易理解,並讓您深入瞭解此特定排序問題的解決方案背後的邏輯。
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']
重複: 「不會的Python有內建的功能,用於串自然排序」 http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort – DeepSpace
你在名稱中有不一致的空格,它們是正確的嗎? –
對不起我的壞。它現在更新了。 – beta