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

2024-04-26 18:31:39 发布

您现在位置: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


Tags: key字符串列表ab排序顺序情况测试用例
2条回答
>>> 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足够长,那么在@falsetru的答案中使用助手dict是值得的。你知道吗

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

这里有一个小技巧,使关键的功能非常快。(dict与@falsetru的略有不同)

>>> 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']

在字符和列组之间建立映射,并在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']

相关问题 更多 >