按字典顺序对字符串进行排序 python

问题描述 投票:0回答:6

我想将字符串按字典顺序排序到列表中

str='aAaBbcCdE'

['A','a','a','B','b','C','c','d','E']

但是

sorted()
给了我这个输出:

['A','B','C','E','a','a','b','c','d']

如何按字典顺序排序?

python sorting lambda
6个回答
42
投票

当工作有内置函数时,不要使用 lambda 函数。也不要使用排序的

cmp
参数,因为它已被弃用:

sorted(s, key=str.lower)

sorted(s, key=str.upper)

但这可能无法保持“A”和“a”的顺序,所以:

sorted(sorted(s), key=str.upper)

这将是,并且根据

sorted
的性质,对于几乎排序的列表,操作将非常快(第二个
sorted
)。


17
投票

您可以使用 2 元组作为键:

text='aAaBbcCdE'
sorted(text, key=lambda x: (str.lower(x), x))
# ['A', 'a', 'a', 'B', 'b', 'C', 'c', 'd', 'E']

元组中的第一个元素

str.lower(x)
是主键(使
a
出现在
B
之前),而
x
本身会打破关系(使
A
出现在
a
之前)。


4
投票

cmp
是执行此操作的旧方法,现已弃用,但对于后代:

s='aAaBbcCdE'
sorted(s, lambda x,y: cmp(x.lower(), y.lower()) or cmp(x,y))

0
投票

如果您不处理简单字符串的集合,但仍想按自然排序顺序而不是字典顺序排序:

假设您有一个对象实例集合,您想按特定属性进行排序,并且属性值可以以大写或小写开头,那么您可以执行以下操作:

sorted(objects, lambda object: object.attr1.lower())

假设

attr1
是字符串类型。为什么这有效?因为您将所有排序键转换为相同的大小写以进行排序,从而击败了字典排序。如果不使用 lower() 或 upper() 将导致字典排序顺序而不是自然字母排序顺序。


0
投票

使用 natsort 库。 使用库比在在线论坛中找到的自定义解决方案更好,因为在线论坛可能无法针对所有边缘情况进行测试。

from natsort import natsorted
natsorted('aAaBbcCdE')

输出:

['A', 'B', 'C', 'E', 'a', 'a', 'b', 'c', 'd']

-1
投票

data = input()
data=list(data)
data.sort()

现在变量“data”将提供按字典顺序排序的输入。

© www.soinside.com 2019 - 2024. All rights reserved.