【问题标题】:Sort a string in lexicographic order python按字典顺序对字符串进行排序python
【发布时间】: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']

如何按字典顺序排序?

【问题讨论】:

    标签: python sorting lambda


    【解决方案1】:

    当工作中有内置函数时,不要使用 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】:

    您可以使用 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 之前)。

    【讨论】:

    • 这为我解决了这个问题,但我不明白为什么返回 x 不会导致正确排序,但返回 (lower(x), x) 会。谁能解释一下?
    • @ScottGartner 返回一个 2-uple (lower(x), x) 基本上使用了已经实现的元组的字典顺序:在元组的索引 0 上相等的所有元素将按索引的元素排序元组的 1,索引 0 上不同的所有元素将照常排序。
    • 这是迄今为止最好的答案!
    【解决方案3】:

    cmp 是这样做的旧方式,现在已弃用,但为了后代:

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

    【讨论】:

    • 不推荐使用 sorted。
    • @KarolyHorvath 很明显,修正你的答案,他就不必了。
    • @AaronHall:这会使 cmets 产生误导。不,谢谢。
    • 其实,让我们把这个答案放在这里:D
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      使用natsort 库。 使用库比使用 stackoverflow 代码解决方案更好。 (仅在 SO 中某处阅读)

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2016-06-14
          • 1970-01-01
          • 2023-01-21
          • 2014-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 2015-03-16
          相关资源
          最近更新 更多