首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中对元组列表进行排序

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

Stack Overflow用户
提问于 2012-04-19 00:42:06
回答 4查看 2.8K关注 0票数 5

在处理Google Python类中的一个问题时,我使用了Stack overflow中的2-3个示例,得出了以下结果:

代码语言:javascript
复制
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)])

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-19 00:46:53

这种模式被称为装饰-排序-取消装饰。

  1. 将每个(1, 3)转换为(3, (1, 3)),将每个tuple包装在一个新的元组中,并首先对要排序的项进行排序。
  2. 进行排序,外部tuple确保原始tuple中的第二项首先排序。H29H110您在保持列表顺序的同时,从D11返回到D12。H213G214

在Python中,显式修饰几乎总是不必要的。相反,请使用key argument of sorted

代码语言:javascript
复制
sorted(list_of_tuples, key=lambda tup: tup[1]) # or key=operator.itemgetter(1)

或者,如果您想对tuple的反向版本进行排序,而不考虑其长度:

代码语言:javascript
复制
sorted(list_of_tuples, key=lambda tup: tup[::-1]) 
                              # or key=operator.itemgetter(slice(None, None, -1))
票数 6
EN

Stack Overflow用户

发布于 2012-04-19 00:54:41

让我们将其分解:

地址:[(tup[1],tup) for tup in tuples]

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

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

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

地址:sorted([(3, (1, 3)), (2, (3, 2)), (1, (2, 1))])

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

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

列表理解迭代给定的列表(在本例中为sorted([...]),并按顺序返回提取的值。

票数 3
EN

Stack Overflow用户

发布于 2012-04-19 00:45:26

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

另一种方法是在排序函数中使用key参数,该函数根据key的值进行排序。在本例中,您希望key是索引1处的每个元组中的项。

代码语言:javascript
复制
>>> from operator import itemgetter
>>> sorted([(1, 3), (3, 2), (2, 1)],key=itemgetter(1))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10213994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档