我想将字符串按字典顺序排序到列表中
str='aAaBbcCdE'
到
['A','a','a','B','b','C','c','d','E']
但是
sorted()
给了我这个输出:
['A','B','C','E','a','a','b','c','d']
如何按字典顺序排序?
当工作有内置函数时,不要使用 lambda 函数。也不要使用排序的
cmp
参数,因为它已被弃用:
sorted(s, key=str.lower)
或
sorted(s, key=str.upper)
但这可能无法保持“A”和“a”的顺序,所以:
sorted(sorted(s), key=str.upper)
这将是,并且根据
sorted
的性质,对于几乎排序的列表,操作将非常快(第二个 sorted
)。
您可以使用 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
之前)。
cmp
是执行此操作的旧方法,现已弃用,但对于后代:
s='aAaBbcCdE'
sorted(s, lambda x,y: cmp(x.lower(), y.lower()) or cmp(x,y))
如果您不处理简单字符串的集合,但仍想按自然排序顺序而不是字典顺序排序:
假设您有一个对象实例集合,您想按特定属性进行排序,并且属性值可以以大写或小写开头,那么您可以执行以下操作:
sorted(objects, lambda object: object.attr1.lower())
假设
attr1
是字符串类型。为什么这有效?因为您将所有排序键转换为相同的大小写以进行排序,从而击败了字典排序。如果不使用 lower() 或 upper() 将导致字典排序顺序而不是自然字母排序顺序。
使用 natsort 库。 使用库比在在线论坛中找到的自定义解决方案更好,因为在线论坛可能无法针对所有边缘情况进行测试。
from natsort import natsorted
natsorted('aAaBbcCdE')
输出:
['A', 'B', 'C', 'E', 'a', 'a', 'b', 'c', 'd']
data = input()
data=list(data)
data.sort()
现在变量“data”将提供按字典顺序排序的输入。