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