我有以下内容:
sorted( ("A","a","b","B","CC","c"), key=lambda x: x.lower() )
Run Code Online (Sandbox Code Playgroud)
这使:
['A', 'a', 'b', 'B', 'c', 'CC']
Run Code Online (Sandbox Code Playgroud)
我该如何排序:
['a', 'A', 'b', 'B', 'c', 'CC']
Run Code Online (Sandbox Code Playgroud)
如果有两个值相同,则下面的形式首先出现 - 在A之前.
我猜我做的是这样的:
sorted( ("A","a","b","B","CC","c"), key=lambda x: (x.lower(),x) )
Run Code Online (Sandbox Code Playgroud)
但这给了A之前的A:
['A', 'a', 'B', 'b', 'c', 'CC']
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
UPDATE
为了进一步澄清事情,以下字符串:["A","a","aA","aa"]应排序为:
["a","A","aa","aA"]
Run Code Online (Sandbox Code Playgroud)
所以在"aA"之前的"aa"和"aAa"之前的"aaA"等.
所以:
lst = ["A","aA","aa","aaa","aAa","aaA","b","B","CC","c"]
Run Code Online (Sandbox Code Playgroud)
应该排序:
['A', 'aa', 'aA', 'aaa', 'aaA', 'aAa', 'b', 'B', 'c', 'CC']
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
lst = ["A","a","b","B","CC","c"]
result = sorted(lst, key= lambda x: (x.lower(), not x.islower()))
print(result)
Run Code Online (Sandbox Code Playgroud)
产量
['a', 'A', 'b', 'B', 'c', 'CC']
Run Code Online (Sandbox Code Playgroud)
UPDATE
鉴于您的新示例,您可以使用以下密钥:
lst = ["A", "aA", "aa", "aaa", "aAa", "aaA", "b", "B", "CC", "c"]
result = sorted(lst, key=lambda x: (x.lower(), ''.join(str(c.isupper()) for c in x)))
print(result)
Run Code Online (Sandbox Code Playgroud)
产量
['A', 'aa', 'aA', 'aaa', 'aaA', 'aAa', 'b', 'B', 'c', 'CC']
Run Code Online (Sandbox Code Playgroud)
对于另一个例子(["A","a","aA","aa"]),它给出:
['a', 'A', 'aa', 'aA']
Run Code Online (Sandbox Code Playgroud)
这是一种方式:
sorted( lst, key=lambda x: (x.lower(), *map(str.isupper, x)) )
#['A', 'aa', 'aA', 'aaa', 'aaA', 'aAa', 'b', 'B', 'c', 'CC']
Run Code Online (Sandbox Code Playgroud)
首先按不区分大小写的字母排序.然后调用str.upper每个字符串的所有字符作为第二个排序条件.对于相同长度的字符串,这将首先对小写字母进行排名.
Python 2版本
上面的语法只适用于python3,但你可以在python2中等效地执行以下操作:
sorted( lst, key=lambda x: ((x.lower(),) + tuple(map(str.isupper, x))) )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |