Python按字母顺序排序字符串,首先是小写

时间:2015-01-25 12:27:27

标签: python sorting

我想使用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

6 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

使用自定义密钥方法检查项目是否不是.lower(),然后比较项目本身。对于'A''D''B' not x.islower()将返回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']

答案 2 :(得分:3)

我们可以使用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']

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

给定:字母数字字符串

目标:按规则排序

  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='')
    

答案 5 :(得分:0)

使用 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']