2015-02-11 171 views
-1

我想要一個列表按照排序(列表)方法進行排序,但是通過字符串進行排序。我的意思是,而不是'abcdefghijklmnopqrstuvwxyz',可以控制它。就像按照'zyabxwcdvueftsghrqijpoklmn'的順序排序,但是要根據您輸入的任何26個字母的字符串來執行此操作。我該怎麼做?根據字符串對列表進行排序-python

排序(列表)方法將列表按字母順序排序。如果我想要反向字母順序,那也很簡單。但是說我想要一個完全自定義的字母優先級?默認情況下,按照'abcdefghijklmnopqrstuvwxyz'的順序對列表進行排序。如果我可以輸入一個字符串,如'zyabxwcdvueftsghrqijpoklmn',我可以根據此優先級對列表進行排序?所以,給定['moose', 'apple', 'zebra', 'penguin']和字符串'zyabxwcdvueftsghrqijpoklmn',我會得到['zebra', 'apple', 'penguin', 'moose'],因爲字母出現在字符串中的順序。

+0

你必須創建自己的算法來做到這一點......也因爲這個問題的措辭,這是超出範圍的SO。 – user2366842 2015-02-11 22:28:05

+0

見下面盧克。它實際上非常簡單。 – 2015-02-11 22:36:15

回答

5
def make_sort_key(key_string): 
    # make index 
    index = {} 
    for i,ch in enumerate(key_string): 
     index[ch] = i 
    # sort any char not in index following any char in index 
    omitted = len(index) 
    val = index.get 

    def key_fn(s): 
     return [val(ch, omitted) for ch in s] 

    return key_fn 

然後

items = [ 
    "abcde", 
    "fghij", 
    "fghde" 
] 

items.sort(key = make_sort_key("gfiabdcej")) 

結果

['fghij', 'fghde', 'abcde'] 
+0

我認爲最好不要重新發明輪子。沒有冒犯,但我覺得我的路線更有效率。 – 2015-02-11 22:54:09

+3

@MalikBrahimi - 這個答案比你的要多,正確地實現了詞法排序。在'['fghde','fghij','abcde']'上用''gfiabdcej''作爲排序字符串測試' - 正確的排序將'fghij'放在'fghde'之前。它也更有效率,但對於我們在這裏看到的數據類型無關緊要 - 字典上的「index.get」比列表上的「index」更快。 – 2015-02-11 23:04:30

+0

事實上,我修復了我的代碼,現在它實際上更高效,而且效果如此之好。 – 2015-02-11 23:14:30

相關問題