Python按字母顺序对字符串排序,先用小写字母

Python按字母顺序对字符串排序,先用小写字母,python,sorting,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 输出(电流): 输出(应为): 使用自定义键方法检查项目是否为.lower(),然后比较项目本身。对于'A','D'和'B'而不是x.islower()将返回True,而对于另一个则返回False

我想使用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
输出(电流):

输出(应为):


使用自定义键方法检查项目是否为
.lower()
,然后比较项目本身。对于
'A'
'D'
'B'
而不是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']
我们可以用它来获取每个字母的索引,以便对它们进行排序

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

import string

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

['a', 'e', 'f', 'A', 'B', 'D']
或者,如果要对原始
arr
列表进行排序,请使用内置函数

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

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

收益率:

['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']

一些计时显示,对单个字符进行排序时,创建dict实际上是最有效的:

蟒蛇2.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
蟒蛇3.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

给定:字母数字字符串

目的:按规则排序

  • 先用小写字母
  • 然后是大写字母
  • 然后是数字(第一个偶数,最后一个奇数)(优先级最低)

  • 使用python 3.9

    就地分拣 输出

    ['a', 'e', 'f', 'A', 'B', 'D']
    
    ['a', 'e', 'f', 'A', 'B', 'D']
    
    注意-使用排序方法时

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

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

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


    请注意,到目前为止,所有答案都是按字母排序的(如您的示例),而不是按单词排序的(如您的问题)。实际上,我的答案是按单词排序的,我只是没有在示例中显示。@georg错了。他们都做分类词。对第一个字符进行排序,然后对第二个字符进行排序,直到得到一个完整的单词。这里唯一的问题是,标准排序的排序索引与OP想要的排序索引不同<代码>字符串。ascii字母的顺序如下。任何在两者之间创建内容的解决方案都是过时的。@PascalvKooten:测试示例:排序
    ['Abc','Abc','Abc']
    应该返回
    ['Abc','Abc']
    @georg我现在明白你的意思了,这确实完全改变了一切。奇怪的是,它返回
    None
    onme@howaboutNO不要将
    arr.sort
    的返回值赋给变量,它会对列表进行适当排序。我认为值得一提的是
    False
    在python中是True。这就是为什么
    (False,'f')<(True,'A')
    不使用导入的好解决方案。@AshwiniChaudhary忽略了这一点。我的错。顺便说一句,这是一个很好的解决方案。@PascalvKooten感谢您的赏识。lambda调用是多余的,
    .index
    已经是一个可调用的:
    arr.sort(key=string.ascii\u letters.index)
    @AshwiniChaudhary非常感谢。起初,我试图通过
    ord
    lambda
    对它进行排序,所以我并没有把重点放在这一点上。唯一的问题是它确实没有对单词进行排序。例如,
    sorted(['Abc','Abc','Abc'],key=lambda x:[string.ascii_letters.index(y)for y in x])
    @PascalvKooten是如果是单词,我们可以根据第一个字母对它们进行排序。我已经在我的答案中加入了请检查,谢谢。我的立场是正确的:这确实应该是最好的答案(这是唯一正确的答案)。它也非常简洁。做得好(如果可能,将更改upvote)。这是与Tanveer答案的第二部分相同的答案,是正确的,甚至可以正确排序多个单词。向上投票。
    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']