在Python中排序元组列表

Var*_*run 5 python

在处理来自Google Python类的问题时,我通过使用来自Stack overflow的2-3个示例来制定以下结果 -

def sort_last(tuples):
    return [b for a,b in sorted((tup[1], tup) for tup in tuples)]

print sort_last([(1, 3), (3, 2), (2, 1)])
Run Code Online (Sandbox Code Playgroud)

我昨天学习了List理解,所以对列表理解有所了解,但我很困惑这个解决方案是如何整体工作的.请帮我理解这个(功能第2行).

agf*_*agf 6

这种模式称为decorate-sort-undecorate.

  1. 你可以将每个元素包装(1, 3)成一个新的元组,并使用你想要排序的项目.(3, (1, 3))tuple
  2. 您排序,外部tuple确保原始中的第二个项目tuple首先排序.
  3. 从你回去(3, (1, 3))(1, 3)同时保持列表的顺序.

在Python中,显式装饰几乎总是不必要的.相反,使用以下key参数sorted:

sorted(list_of_tuples, key=lambda tup: tup[1]) # or key=operator.itemgetter(1)
Run Code Online (Sandbox Code Playgroud)

或者,如果你想tuple对它的反转版本进行排序,无论它的长度如何:

sorted(list_of_tuples, key=lambda tup: tup[::-1]) 
                              # or key=operator.itemgetter(slice(None, None, -1))
Run Code Online (Sandbox Code Playgroud)

  • @Varun`lambda`只是让你在表达式中声明一个函数.它与`def first_item(tup)相同:在函数调用之外返回tup [1]`,然后在函数调用中返回`key = first_item`.请参阅Python教程中的[Lambda Forms](http://docs.python.org/tutorial/controlflow.html#lambda-forms). (2认同)