我想按字典顺序将字符串排序为列表
str='aAaBbcCdE'
到
['A','a','a','B','b','C','c','d','E']
但是sorted()
给了我这个输出:
['A','B','C','E','a','a','b','c','d']
如何按字典顺序排序?
答案 0 :(得分:31)
当有内置的lambda函数时,不要使用lambda函数。也永远不要使用排序的cmp
参数,因为它已被弃用:
sorted(s, key=str.lower)
或
sorted(s, key=str.upper)
但这可能无法保持'A'和'a'的顺序,所以:
sorted(sorted(s), key=str.upper)
这将是sorted
的性质,对于几乎排序的列表(第二个sorted
),操作将非常快。
答案 1 :(得分:11)
您可以使用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
)。
答案 2 :(得分:4)
cmp
是这样做的旧方式,现在已被弃用,但对于后代:
s='aAaBbcCdE'
sorted(s, lambda x,y: cmp(x.lower(), y.lower()) or cmp(x,y))
答案 3 :(得分:0)
data = input()
data=list(data)
data.sort()
现在变量"数据"将提供按字典顺序排序的输入。
答案 4 :(得分:0)
使用natsort库。 比使用stackoverflow代码解决方案更好地使用库。 (仅在SO中读取)
答案 5 :(得分:0)
如果您不处理简单字符串的集合,但仍想按自然排序顺序而不是字典顺序排序:
假设您有一组对象实例,您希望按特定属性对其进行排序,并且属性值可以以大写或小写开头,那么您可以执行以下操作:
sorted(objects, lambda object: object.attr1.lower())
假设 attr1
是字符串类型。为什么这样做?因为您将所有排序键转换为相同的大小写以进行排序,从而打败了字典排序。不使用lower() 或upper() 将导致字典排序顺序而不是自然的字母排序顺序。