【问题标题】:python sort without lambda expressions没有lambda表达式的python排序
【发布时间】:2010-08-04 16:00:44
【问题描述】:

我经常在 Python 中使用 lambda 表达式进行排序,虽然它工作得很好,但我发现它的可读性不太好,希望有更好的方法。这是我的一个典型用例。

我有一个数字列表,例如,x = [12, 101, 4, 56, ...]

我有一个单独的索引列表:y = range(len(x))

我想根据x 中的值对y 进行排序,我这样做:

y.sort(key=lambda a: x[a])

有没有不使用 lambda 的好方法?

【问题讨论】:

  • 原始值的排序列表不够用的任何特殊原因? x_sorted = sorted(x)
  • OP希望元素的索引按排序顺序,而不是元素本身。
  • 很遗憾lambda 是一个又长又丑的关键字。这几乎就是这样做的方法。
  • 看起来与stackoverflow.com/questions/3382352/… 非常相似,我在其中回答了“排名顺序列表”解决方案,不幸的是使用 lambda。对我来说,我更喜欢它而不是 itemgetter 解决方案。

标签: python lambda sorting


【解决方案1】:

您可以使用列表 x 的__getitem__ 方法。这与您的 lambda 行为相同,并且会更快,因为它是作为 C 函数而不是 python 函数实现的:

>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]

【讨论】:

    【解决方案2】:

    不优雅,但是:

    [a for (v, a) in sorted((x[a], a) for a in y)]
    

    顺便说一句,您可以在不创建单独的索引列表的情况下执行此操作:

    [i for (v, i) in sorted((v, i) for (i, v) in enumerate(x))]
    

    【讨论】:

      【解决方案3】:

      我不确定这是否是您的意思,但您可以使用 def 定义键功能:

      def sort_key(value):
          return x[value]
      
      y.sort(key = sort_key)
      

      就我个人而言,我认为这比 lambda 更糟糕,因为它将排序标准从执行排序的代码行中移开,并且不必要地将 sort_key 函数添加到您的命名空间中。

      【讨论】:

        【解决方案4】:

        我想如果我想创建另一个函数,我可以这样做(未测试):

        def sortUsingList(indices, values):
            return indices[:].sort(key=lambda a: values[a])
        

        虽然我认为我更喜欢使用 lambda 来避免创建额外的函数。

        【讨论】:

        • 您正在针对请求使用 lambda(尽管我自己会使用它)。
        猜你喜欢
        • 2022-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        相关资源
        最近更新 更多