【问题标题】:Sort a list alphabetically first and then numerically?先按字母顺序排序列表,然后按数字排序?
【发布时间】:2020-09-03 09:56:54
【问题描述】:

如何在 Python 中先按字母顺序排序字符串列表,然后再按数字排序?

例如:

Given list: li = ['4', '1', '3', '9', 'Z', 'P', 'V', 'A']

我想要排序后的如下输出:

sorted_list = ['A', 'P', 'V', 'Z', '1', '3', '4', '9']

【问题讨论】:

    标签: python python-3.x string list sorting


    【解决方案1】:
    sorted(sorted_list, key=lambda x: (x.isnumeric(),int(x) if x.isnumeric() else x))
    

    这也按整数的值排序

    【讨论】:

    • sorted(lst, key=lambda x: (1, int(x)) if x.isnumeric() else (0, x)).
    • 哇,python 将整数与字符串进行比较的方式非常奇怪。基本上任何字符串都将永远大于任何 int。
    • @matvs 不,元组的第一个元素保证是不同的,所以第二个元素总是比较like和like。
    【解决方案2】:

    你可以试试这个。使用str.isdigit可以实现所需的输出

    sorted(l,key=lambda x:(x.isdigit(),x))
    # ['A', 'P', 'V', 'Z', '1', '3', '4', '9']
    

    注意:此解决方案不能处理多个数字。请看@Martin's的答案。

    【讨论】:

      【解决方案3】:
      list1 = ['4', '1', '3', '9', 'Z', 'P', 'V', 'A']
      number = []
      alphabet = []
      for l in list1:
          if l.isnumeric():
              number.append(l)
          else:
              alphabet.append(l)
      
      number = sorted(number)
      alphabet = sorted(alphabet)
      list1 = alphabet + number
      print(list1)
      

      【讨论】:

      • 您不应该使用list 作为变量名。此外,当数字超过一位时,这无法按数字顺序排序。
      【解决方案4】:

      如果您希望它考虑负数、小数和小写字母:

      li = ['A', 'b', '-400', '1.3', '10', '42', 'V', 'z']
      
      threshold = abs(min(float(x) for x in li if not x.isalpha())) +  ord('z') + 1
      sorted_list = sorted(li,
                           key=lambda x: ord(x) if x.isalpha() else threshold + float(x))
      

      sorted_list:

      ['A', 'V', 'b', 'z', '-400', '1.3', '10', '42']
      

      【讨论】:

        最近更新 更多