【问题标题】:python: how to sort lists alphabetically with respect to capitalized letterspython:如何根据大写字母按字母顺序对列表进行排序
【发布时间】:2013-05-16 07:44:55
【问题描述】:

我正在尝试按字母顺序对列表进行排序,其中大写字母应位于小写字母之前。

l = ['a', 'b', 'B', 'A']

sorted(l) 应该是['A','a','B','b']

这两种形式我都试过了,但都无济于事;

>>> sorted(l, key=lambda s: s.lower())
['a', 'A', 'b', 'B']
>>> sorted(l, key=str.lower)
['a', 'A', 'b', 'B']

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

    改为创建一个元组作为您的键:

    >>> sorted(lst, key=lambda L: (L.lower(), L))
    ['A', 'a', 'B', 'b']
    

    这意味着小写的排序顺序不会改变('a', 'a'),但意味着大写的第一个键将它与小写等效项放在一起,然后在它之前排序:例如('a', 'A') ('a', 'a')

    【讨论】:

    • 完美解决方案。很抱歉我之前的评论很糟糕:)
    • 如果您有非英语字符串,请非常小心依赖使用.lower() 进行不区分大小写排序的方法,它们仅适用于 ASCII 字符子集。正确的方法是稍微摆弄一下区域设置。
    • 例如,此解决方案不适用于 python 2 上的 lst = ['á', 'b', 'B', 'Á'](可能会在 python3 上)
    • @Wim on Py2... ['a', 'B', 'b', '\xc3\x81'] on 3.3: ['B', 'b', 'Á', 'á']
    • 仅使用常规字母字符顺便说一句:[a-z] 和 [A-Z]
    【解决方案2】:

    有趣的是这样的列表应该如何对以下列表进行排序

    lst = ['abb', 'ABB', 'aBa', 'AbA']
    

    提出的解决方案产生以下结果

    >>> sorted(lst, key=lambda L: (L.lower(), L))
    ['AbA', 'aBa', 'ABB', 'abb']
    

    我可以提出更复杂的不同结果的解决方案

    >>> sorted(lst, key=lambda a: sum(([a[:i].lower(), 
                                        a[:i]] for i in range(1, len(a)+1)),[]))
    ['ABB', 'AbA', 'aBa', 'abb']
    

    【讨论】:

    • 好主意,但表达式可以更简单——[ord(x)+31.5*x.isupper() for x in a] 怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多