2015-02-11 112 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

相关问题