以自然方式对字符串列表进行排序

Baz*_*Baz 6 python python-3.x

我有以下内容:

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)

Dan*_*ejo 9

你可以这样做:

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)


pau*_*ult 5

这是一种方式:

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)