如何根据字符串对列表进行排序?

时间:2014-02-25 05:46:48

标签: python

在这里,我尝试根据一个字符串对字符串列表进行排序,这是我的测试用例,

第一种情况:

par_str = "abcd"
list_str = ['bb','ba','ab']

sorted(list_str, key=par_str)

输出: ['ab','ba','bb']

第二种情况:

par_str = "bacd"
list_str = ['bb','ba','ab']

sorted(list_str, key=par_str)

输出: ['bb','ba','ab']

根据par_str字符串更改的第一个案例列表顺序。第二个测试用例列表顺序没有变化,因为它具有相同的优先级。那么如何写上面的逻辑呢。我试过,但收到错误TypeError: 'str' object is not callable

2 个答案:

答案 0 :(得分:1)

在字符和排名之间进行映射,并在key函数中使用该信息。

>>> par_str = "abcd"
>>> order = {c:i for i, c in enumerate(par_str)} # <------------
>>> order
{'a': 1, 'c': 2, 'b': 0, 'd': 3}
>>> list_str = ['bb','ba','ab']
>>> sorted(list_str, key=lambda s: [order[c] for c in s])
['ab', 'ba', 'bb']

>>> par_str = "bacd"
>>> order = {c:i for i, c in enumerate(par_str)} # <-----------
>>> order
{'a': 1, 'c': 2, 'b': 0, 'd': 3}
>>> list_str = ['bb','ba','ab']
>>> sorted(list_str, key=lambda s: [order[c] for c in s])
['bb', 'ba', 'ab']

答案 1 :(得分:1)

>>> par_str = "abcd"
>>> list_str = ['bb','ba','ab']
>>> 
>>> def key_func(s):
...     return [par_str.index(i) for i in s]
... 
>>> sorted(list_str, key=key_func)
['ab', 'ba', 'bb']
>>> par_str = "bacd"
>>> sorted(list_str, key=key_func)
['bb', 'ba', 'ab']

如果par_str足够长,那么在@fattru的答案中使用助手dict是值得的。

如果您希望能够测试您的关键功能,最好使用完整的函数定义而不是lambda

这是让关键功能非常快的一个小技巧。 (该词典与@fattru's略有不同)

>>> par_str = "abcd"
>>> list_str = ['bb','ba','ab']
>>> sorted(list_str, key=lambda s, trans={ord(c): i for i, c in enumerate(par_str)}:s.translate(trans))
['ab', 'ba', 'bb']
>>> par_str = "bacd"
>>> sorted(list_str, key=lambda s, trans={ord(c): i for i, c in enumerate(par_str)}:s.translate(trans))
['bb', 'ba', 'ab']