[英]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.