2014-01-14 75 views
1

我必須符合模式的文件名列表:s[num][alpha1][alpha2].ext自定義排序複雜的字符串在Python

我需要排序,首先由數字,然後通過α1,然後通過α-2。然而,最後兩個不是按字母順序的,而是應該反映出一個自定義順序。

我創建爲代表α1和α2排序兩個列表,像這樣:

alpha1Order = ["Fizz", "Buzz", "Ipsum", "Dolor", "Lorem"] 
alpha2Order = ["Sit", "Amet", "Test"] 

什麼是前進的最好方法是什麼?我的第一個雖然是標記(不知何故),以便我將每個文件名拆分爲其組成部分(s,num,alpha1,alpha2),然後排序,但我不太確定如何執行這樣複雜的排序。使用一個關鍵功能似乎很笨重,因爲這種排序似乎並不適合簡單的排序。

+0

一旦標記,您的數據就可以通過'鍵'功能完美訂購。 –

+0

您能否指點我更多關於如何使用'key'函數按多個屬性排序的信息?我不確定如何先排序,然後排在第二位,然後排在第三位。 – Walker

回答

3

一旦標記,您的數據就可以通過key函數完美訂購。只需返回該值的alpha1Orderalpha2Order列表的索引即可。將它們替換爲字典以使查找更容易:

alpha1Order = {token: i for i, token in enumerate(alpha1Order)} 
alpha2Order = {token: i for i, token in enumerate(alpha2Order)} 

def keyfunction(filename): 
    num, alpha1, alpha2 = tokenize(filename) 
    return int(num), alpha1Order[alpha1], alpha2Order[alpha2] 

這會返回一個元組進行排序; Python將使用第一個值進行排序,按第二個條目排序具有相同int(num)值的任何值,並使用第三個值打破與前兩個條目相關的任何值。

+0

謝謝Martijn。我幾乎解決了這個問題,但遇到了令牌化問題。由於其複雜性,我已將其作爲單獨問題發佈,並希望在解決問題之前解決這兩個問題。 https://stackoverflow.com/questions/21120378/split-a-python-string-using-multiple-delimiters – Walker

+0

這是一個單獨的問題;這個答案不會因你如何解決令牌化問題而受到影響。 –