【发布时间】:2011-09-10 13:17:22
【问题描述】:
我想按字典顺序将字符串排序到列表中
str='aAaBbcCdE'
到
['A','a','a','B','b','C','c','d','E']
但是sorted() 给了我这个输出:
['A','B','C','E','a','a','b','c','d']
如何按字典顺序排序?
【问题讨论】:
我想按字典顺序将字符串排序到列表中
str='aAaBbcCdE'
到
['A','a','a','B','b','C','c','d','E']
但是sorted() 给了我这个输出:
['A','B','C','E','a','a','b','c','d']
如何按字典顺序排序?
【问题讨论】:
当工作中有内置函数时,不要使用 lambda 函数。也永远不要使用 sorted 的 cmp 参数,因为它已被弃用:
sorted(s, key=str.lower)
或
sorted(s, key=str.upper)
但这可能无法保持 'A' 和 'a' 的顺序,所以:
sorted(sorted(s), key=str.upper)
这将,并且由于sorted 的性质,对于几乎已排序的列表(第二个sorted),该操作将非常快。
【讨论】:
sorted(sorted(s), key=str.upper) 脱颖而出。
您可以使用 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 之前)。
【讨论】:
(lower(x), x) 基本上使用了已经实现的元组的字典顺序:在元组的索引 0 上相等的所有元素将按索引的元素排序元组的 1,索引 0 上不同的所有元素将照常排序。
cmp 是这样做的旧方式,现在已弃用,但为了后代:
s='aAaBbcCdE'
sorted(s, lambda x,y: cmp(x.lower(), y.lower()) or cmp(x,y))
【讨论】:
data = input()
data=list(data)
data.sort()
现在变量“data”将提供按字典顺序排序的输入。
【讨论】:
使用natsort 库。 使用库比使用 stackoverflow 代码解决方案更好。 (仅在 SO 中某处阅读)
【讨论】:
如果您不处理简单字符串的集合,但仍希望按自然排序顺序而不是字典顺序进行排序:
假设您有一组对象实例,您希望按特定属性排序,并且属性值可以以大写或小写开头,那么您可以执行以下操作:
sorted(objects, lambda object: object.attr1.lower())
假设attr1 是字符串类型。为什么这行得通?因为您将所有排序键转换为相同的大小写以进行排序,从而破坏了字典排序。不使用 lower() 或 upper() 将导致字典排序顺序而不是自然的字母排序顺序。
【讨论】: