【问题标题】:Sort list to make letters come before digits in any position排序列表以使字母在任何位置的数字之前
【发布时间】:2018-12-07 17:23:13
【问题描述】:

假设我有以下列表:

l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']

当在还包含数字的字符串列表上使用sorted() 时,数字在字母之前,因此在这种情况下会产生:

sorted(l)
['a1', 'aa', 'ae', 'erge4', 'erge7', 'erget', 'm1', 'm2', 'me2', 'mea', 'mei']

我已经看到了一些答案,例如this one,关于如何使字母出现在数字之前,但仅限于单个数字或字母。当数字可以在字符串中的任何位置时,是否也可以在sorted() 中使用一些key 来做到这一点?所以预期的输出:

['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

    您可以将sorted 与元组列表一起用作自定义键:

    L = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
    res = sorted(L, key=lambda x: [(i.isdigit(), i) for i in x])
    
    # ['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']
    

    【讨论】:

    • 实际上我忘了提到我还需要它们按长度排序,但只是使用sorted(l, key=lambda x: [len(x)] + [(i.isdigit(), i) for i in x]) 从您的解决方案中完成了。很好的解决方案,谢谢!
    【解决方案2】:

    您可以使用一个键函数来遍历给定字符串的每个字符,并将'z' 添加到数字前面,以便它们在字母之后排序:

    l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
    sorted(l, key=lambda s: ['z' + c if c.isdigit() else c for c in s])
    

    这会返回:

    ['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']
    

    【讨论】:

      【解决方案3】:

      有点小技巧:

      >>> l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
      >>> sorted(l, key=lambda a: [ord(c) if ord(c) > 57 else ord(c) + 100 for c in a])
      ['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        相关资源
        最近更新 更多