Python 按字母顺序对字符串排序,小写在前

Python sort strings alphabetically, lowercase first

我想使用 python 按字母顺序对给定的字符串数组进行排序,但小写单词应排在第一位。

一个例子:

#!/usr/local/bin/python2.7
arr=['A','e','a','D','f','B']
arr.sort()
for s in arr: print s

输入:

A
e
a
D
f
B

输出(当前):

A
B
D
a
e
f

输出(应该是):

a
e
f
A
B
D

使用自定义键方法检查项目是否不是 .lower(),然后比较项目本身。对于 'A''D''B' not x.islower() 将 return True 而对于其他是 False,因为 True > False 小件物品优先:

>>> arr = ['A','e','a','D','f','B']
>>> arr.sort(key=lambda x:(not x.islower(), x))
>>> arr
['a', 'e', 'f', 'A', 'B', 'D']

我们可以使用string.ascii_letters来获取每个字母的索引来对它们进行排序。

arr = ['A','e','a','D','f','B']

import string

print sorted(arr, key=string.ascii_letters.index)

结果:

['a', 'e', 'f', 'A', 'B', 'D']

或者,如果您想对原始 arr 列表进行排序,请使用 sort 内置函数。

arr.sort(key=string.ascii_letters.index)
print arr

如果 arr 列表中有单词而不是单个字母或字母表,我们可以使用 str.swapcase

arr = ['Abc', 'abc', 'aBc']
print sorted(arr, key=str.swapcase)

产量:

['abc', 'aBc', 'Abc']

要对单词进行排序,而不仅仅是字母,只需交换大小写即可:

>>> words = ['alpha', 'Alpha', 'aLpha', 'Bravo', 'bRavo']
>>> sorted(words)
['Alpha', 'Bravo', 'aLpha', 'alpha', 'bRavo']
>>> sorted(words, key=str.swapcase)
['alpha', 'aLpha', 'bRavo', 'Alpha', 'Bravo']

一些时间表明,对于对单个字符进行排序,创建字典实际上是最有效的:

python2.7:

from string import ascii_letters

d = {b:a for a, b  in enumerate(ascii_letters)}

In [34]: timeit  sorted(s, key=str.swapcase)
10 loops, best of 3: 32.6 ms per loop

In [35]: timeit sorted(s,key=lambda x: (not x.islower(),x))
10 loops, best of 3: 51.4 ms per loop

In [37]: timeit (sorted(s ,key=d.get))
10 loops, best of 3: 22.4 ms per loop

Python3.4:

In [4]: timeit sorted(s,key=lambda x: (not x.islower(),x))
10 loops, best of 3: 57.7 ms per loop

In [5]: timeit  sorted(s, key=str.swapcase)
10 loops, best of 3: 41.2 ms per loop

In [6]: timeit (sorted(s ,key=d.get))
10 loops, best of 3: 21.1 ms per loop

给定:字母数字字符串

目的:按规则排序

  1. 小写字母优先。
  2. 然后是大写字母。
  3. 然后是数字(偶数在前,奇数在后)(最低优先级)。

    def func(l):
        if l.islower():
            return ord(l) - 32
        elif l.isupper():
            return ord(l) + 32
        elif l.isdigit():
            if int(l) % 2 == 0:
                return ord(l) + 200
            else:
                return ord(l) + 100
    
    print(*sorted(st, key=func), sep='')
    

使用 python 3.9

就地排序

arr=['A','e','a','D','f','B']
arr.sort(key=lambda x: (x.isupper(), x))
arr

输出

['a', 'e', 'f', 'A', 'B', 'D']

注意 - 使用排序方法时

不抑制异常 - 如果任何比较操作失败,整个排序操作将失败(并且列表可能会保留部分修改状态)。

排序并分配给另一个变量,保持原始列表不变

arr=['A','e','a','D','f','B']
sorted_arr = sorted(arr, key=lambda x: (x.isupper(), x))
sorted_arr

输出

['a', 'e', 'f', 'A', 'B', 'D']