【问题标题】:How to sort first by letter then by number? [duplicate]如何先按字母排序,然后按数字排序? [复制]
【发布时间】:2021-09-13 23:10:57
【问题描述】:

在谷歌上搜索了一段时间,但似乎找不到我可以开始工作的答案。

我想要这份清单 -

sws = ['C6', 'A4', 'B8', 'A8', 'B11', 'C3', 'C5']

要排序到 -

sws = ['A4', 'A8', 'B8', 'B11', 'C3', 'C5', 'C6']

我可以接近,但我似乎无法以正确的方式获得 B11 和 B8,即。在我的列表中,B11 总是排在 B8 之前。

谢谢

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    您也可以在此处使用natsort,这有助于进行直观的排序:

    >>> import natsort
    >>> natsort.natsorted(sws)
    ['A4', 'A8', 'B8', 'B11', 'C3', 'C5', 'C6']
    

    【讨论】:

      【解决方案2】:

      您可以使用函数来修改每个列表项的排序键,而不改变原来的list内容:

      def sort_key(text: str):
          letter = text[0]   # the first char
          digits = text[1:]  # everything after the first char
          return (letter, int(digits))
      
      >>> sws = ['C6', 'A4', 'B8', 'A8', 'B11', 'C3', 'C5']
      >>> sorted(sws, key=sort_key)
      ['A4', 'A8', 'B8', 'B11', 'C3', 'C5', 'C6']
      

      【讨论】:

        【解决方案3】:

        这可以用一个衬里来完成 -

        sws.sort(key=lambda x: (x[0], int(x[1:])))
        
        print(sws)
        # ['A4', 'A8', 'B8', 'B11', 'C3', 'C5', 'C6']
        

        说明:
        元组列表按第一个元素排序,然后是第二个元素,依此类推。
        .sort() 方法可以根据函数排序,在这种特定情况下,函数是一个简单的 lambda 函数,它返回一个由字母组成的二元组,然后是字符串其余部分的数值(假设成为一个数字)。
        结合这两个属性会产生您所描述的就地排序。

        【讨论】:

          猜你喜欢
          • 2013-06-29
          • 1970-01-01
          • 1970-01-01
          • 2020-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-17
          • 1970-01-01
          相关资源
          最近更新 更多