Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中对元组列表进行排序_Python - Fatal编程技术网

在Python中对元组列表进行排序

在Python中对元组列表进行排序,python,Python,在处理Google Python类中的一个问题时,我使用堆栈溢出中的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)]) 我昨天学习了列表理解,所以对列表理解有点了解,但我对这个解决方案的整体效果感到困惑。请帮助我理解这一点(函数中的第二行)。您的示例通过创

在处理Google Python类中的一个问题时,我使用堆栈溢出中的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)])

我昨天学习了列表理解,所以对列表理解有点了解,但我对这个解决方案的整体效果感到困惑。请帮助我理解这一点(函数中的第二行)。

您的示例通过创建一个新列表来工作,该列表中的元素位于索引
1
,然后是列表中每个元组的原始元组。例如,第一个元素的
(3,(1,3))
。排序函数从索引
0
开始按每个元素排序,因此列表按第二项排序。然后,该函数遍历新列表中的每个项,并返回原始元组

另一种方法是在排序函数中使用
参数,该参数根据
键的值进行排序。在这种情况下,您希望
成为索引
1
处每个元组中的项

>>> from operator import itemgetter
>>> sorted([(1, 3), (3, 2), (2, 1)],key=itemgetter(1))

这种图案被称为装饰类非装饰

  • 您可以将每个
    (1,3)
    转换为
    (3,(1,3))
    ,将每个
    元组
    包装在一个新的元组中,其中包含要首先排序的项
  • 您可以使用外部的
    元组进行排序,确保原始
    元组中的第二项按第一项排序
  • 您可以从
    (3,(1,3))
    返回到
    (1,3)
    ,同时保持列表的顺序
  • 在Python中,显式修饰几乎总是不必要的。相反,请使用以下命令:

    或者,如果您想对
    元组的反向版本进行排序,无论其长度如何:

    sorted(list_of_tuples, key=lambda tup: tup[::-1]) 
                                  # or key=operator.itemgetter(slice(None, None, -1))
    
    让我们把它分解一下:

    In:
    [(tup[1],tup)用于元组中的tup]

    输出:
    [(3,(1,3)),(2,(3,2)),(1,(2,1))]

    所以我们刚刚创建了一个新的元组,它的第一个值是内部元组的最后一个值,这样它就按照“tuples”中每个元组的第二个值进行排序

    现在我们对返回的列表进行排序:

    在:
    排序([(3,(1,3)),(2,(3,2)),(1,(2,1)))

    输出:
    [(1,(2,1)),(2,(3,2)),(3,(1,3))]

    现在我们将列表按每个元组的第二个值排序。剩下的就是提取原始元组,这是通过从for循环中只提取b来完成的


    列表理解将迭代给定的列表(
    排序([…]),并按顺序返回提取的值。

    请参考接受的答案。+以下是一个更好的可视化示例

    key
    是一个函数,它将被调用来转换集合的项以进行比较。类似于Java中的
    compareTo
    方法

    传递给key的参数必须是可调用的。在这里,使用
    lambda
    创建一个匿名函数(可调用)。
    lambda的语法是单词lambda后跟一个iterable名称,然后是一段代码

    下面的示例中,我们对一个元组列表进行排序,该列表包含特定事件和参与者名称的信息abt time

    我们按照事件发生时间对列表进行排序,事件发生时间是元组的第0个元素

    为准备好的球员呐喊(一个球迷!)


    注意-
    s.sort([cmp[,key[,reverse]])
    对s的项进行就地排序

    它不会反转列表中的每个元组。它将每个元组包装在另一个元组中。哦,对了,我错过了,我以为它是tup[1],tup[0],但现在我回头看,我发现我看错了,我将编辑我的答案。非常感谢,现在已经很清楚了,你能告诉我一些关于lambda的信息吗(我知道我可以在堆栈溢出中找到它,但想知道你在这里使用lambda的情况)@Varun
    lambda
    只允许在表达式中声明函数。这与
    def first_item(tup)相同:在函数调用外部返回tup[1]
    ,然后在函数调用中返回
    key=first_item
    。请参阅Python教程中的“该模式称为装饰排序取消装饰”。。从不知道它有个名字谢谢,很好的解释。你会添加一个到“谷歌Python类”的链接吗?
    sorted(list_of_tuples, key=lambda tup: tup[::-1]) 
                                  # or key=operator.itemgetter(slice(None, None, -1))
    
    >>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]
    >>> gunters.sort(key=lambda tup: tup[0])
    >>> print gunters
    [('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]