在这里,我尝试根据一个字符串对字符串列表进行排序,这是我的测试用例,
第一种情况:
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
答案 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']