代码之家  ›  专栏  ›  技术社区  ›  minou

不带lambda表达式的python排序

  •  6
  • minou  · 技术社区  · 14 年前

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

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

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

    我想分类 y 基于中的值 x ,我这样做:

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

    在不使用lambda的情况下,有没有好的方法可以做到这一点?

    4 回复  |  直到 14 年前
        1
  •  12
  •   Dave Kirby    14 年前

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

    >>> x = [12, 101, 4, 56]
    >>> y = range(len(x))
    >>> sorted(y, key=x.__getitem__)
    [2, 0, 3, 1]
    
        2
  •  5
  •   Marcelo Cantos    14 年前

    不优雅,但:

    [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
  •  3
  •   David Webb    14 年前

    我不确定这是否是您的意思,但是您可以用 def :

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

    我个人认为这比 lambda 当它将排序条件从执行排序的代码行移开时,它不必要地添加了 sort_key 函数到您的命名空间中。

        4
  •  0
  •   minou    14 年前

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

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

    尽管我认为我更喜欢使用lambda,而不是避免创建一个额外的函数。