【问题标题】:Sorting a list by hundreds/ones按数百/个对列表进行排序
【发布时间】:2018-10-26 21:22:11
【问题描述】:

我想对一个列表进行排序:

[103, 302, 405, 204, 301, 105, 202, 303, 201, 404]

生产:

[201, 301, 202, 302, 103, 303, 204, 404, 105, 405]

我该怎么做?

【问题讨论】:

  • 几十个呢?

标签: python python-3.x list sorting


【解决方案1】:

另一种对较长数字进行排序的方法是意识到您只是按倒序的数字进行排序。

sorted(L, key=lambda x: str(x)[::-1])

【讨论】:

  • 打败我 :) +1
  • 一整分钟 :-)
【解决方案2】:

如果您想按相反顺序对数字进行排序,我会说这是一个可以宽恕使用字符串进行比较的地方:

lst.sort(key=lambda x: str(x)[::-1])

这提供了输出:

[201, 301, 202, 302, 103, 303, 204, 404, 105, 405]

这是IDEOne Link

【讨论】:

    【解决方案3】:

    定义一个 lambda 函数以提取您想要的数字,并将其用作排序键。例如:

    list = [103, 302, 405, 204, 301, 105, 202, 303, 201, 404]
    result = sorted(list, key=lambda x: ((x % 10), (x / 100 % 10)))
    

    这基本上是说使用排序键排序这个列表,然后是百位数字。

    【讨论】:

      【解决方案4】:

      如果您可以有 3 以外的长度数,或/并且中间不必为零:

      def myFunc(n):
        x = ''
        while n:
          x = x + str(n % 10)
          n = (n - n % 10) // 10
        return int(x)
      
      cars = [103, 302, 405, 204, 301, 105, 202, 303, 201, 404]
      
      cars.sort(key=myFunc)
      
      print(cars)
      

      【讨论】:

        【解决方案5】:

        您可以使用商 (%) 和除法 (//) 运算符来定义排序键:

        L = [103, 302, 405, 204, 301, 105, 202, 303, 201, 404]
        
        res = sorted(L, key=lambda x: (x % 10, x // 100))
        
        [201, 301, 202, 302, 103, 303, 204, 404, 105, 405]
        

        如果您可以使用第 3 方库,那么使用 NumPy 会更高效:

        import numpy as np
        
        A = np.array([103, 302, 405, 204, 301, 105, 202, 303, 201, 404])
        
        res = A[np.lexsort((A // 100, A % 10))]
        
        array([201, 301, 202, 302, 103, 303, 204, 404, 105, 405])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-31
          • 2021-04-21
          • 1970-01-01
          • 2011-10-31
          • 2021-02-07
          • 1970-01-01
          相关资源
          最近更新 更多