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
给定:字母数字字符串
目的:按规则排序
- 小写字母优先。
- 然后是大写字母。
然后是数字(偶数在前,奇数在后)(最低优先级)。
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']
我想使用 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
给定:字母数字字符串
目的:按规则排序
- 小写字母优先。
- 然后是大写字母。
然后是数字(偶数在前,奇数在后)(最低优先级)。
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']