简体   繁体   English

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

[英]How to sort the list based on the string?

Here I am try to sort the list of strings based on the one string, Here my test cases, 在这里,我尝试根据一个字符串对字符串列表进行排序,在这里是我的测试用例,

First Case: 第一种情况:

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

sorted(list_str, key=par_str)

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

Second Case: 第二种情况:

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

sorted(list_str, key=par_str)

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

From the First case list order changed based on par_str string. 从第一种情况开始,列表顺序基于par_str字符串更改。 And Second test case the list order no change because it has same priority. 并且第二个测试用例的列表顺序没有变化,因为它具有相同的优先级。 So How to write above logic. 那么如何写上面的逻辑。 I have tried but I am getting an error TypeError: 'str' object is not callable 我已经尝试过,但遇到错误TypeError: 'str' object is not callable

Make a mapping between characters and ranks, and use that information in key function. 在字符和等级之间进行映射,并在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']
>>> 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']

If par_str is long enough it will be worthwhile using the helper dict in @falsetru's answer. 如果par_str足够长,则值得在@falsetru的答案中使用helper dict

It's preferable to use a full function definition rather than a lambda if you would like to be able to test your key function 如果您希望能够测试关键功能,则最好使用完整的函数定义而不是lambda。

Here is a little trick to make the key function really fast. 这是使按键功能真正快速的一个小技巧。 (The dict is subtly different to @falsetru's) (字典与@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']

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM