代码之家  ›  专栏  ›  技术社区  ›  yatu Sayali Sonawane

排序列表,使字母在任何位置的数字之前

  •  3
  • yatu Sayali Sonawane  · 技术社区  · 6 年前

    假设我有以下列表:

    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 关于如何使字母出现在数字之前,但仅限于单个数字或字母。也可以用一些 key 在里面 排序() 数字何时可以在字符串中的任何位置?预期产量:

    ['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']
    
    3 回复  |  直到 6 年前
        1
  •  6
  •   jpp    6 年前

    你可以使用 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']
    
        2
  •  2
  •   blhsing    6 年前

    您可以使用一个键函数,该函数遍历给定字符串的每个字符并在前面加上前缀。 '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
  •  0
  •   Joe Iddon    6 年前

    有点像黑客:

    >>> 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']