在处理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)])我昨天学习了列表理解,所以我对列表理解有一点了解,但我对这个解决方案整体上是如何工作的感到困惑。请帮助我理解这一点(函数的第二行)。
发布于 2012-04-19 00:46:53
这种模式被称为装饰-排序-取消装饰。
(1, 3)转换为(3, (1, 3)),将每个tuple包装在一个新的元组中,并首先对要排序的项进行排序。tuple确保原始tuple中的第二项首先排序。H29H110您在保持列表顺序的同时,从D11返回到D12。H213G214在Python中,显式修饰几乎总是不必要的。相反,请使用key argument of sorted
sorted(list_of_tuples, key=lambda tup: tup[1]) # or key=operator.itemgetter(1)或者,如果您想对tuple的反向版本进行排序,而不考虑其长度:
sorted(list_of_tuples, key=lambda tup: tup[::-1])
# or key=operator.itemgetter(slice(None, None, -1))发布于 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([...]),并按顺序返回提取的值。
发布于 2012-04-19 00:45:26
您的示例的工作方式是创建一个新列表,该列表中的元素位于索引1处,后跟列表中每个元组的原始元组。例如:第一个元素的(3,(1,3))。排序函数按照从索引0开始的每个元素排序,因此列表是按第二个项目排序的。然后,该函数遍历新列表中的每个项目,并返回原始元组。
另一种方法是在排序函数中使用key参数,该函数根据key的值进行排序。在本例中,您希望key是索引1处的每个元组中的项。
>>> from operator import itemgetter
>>> sorted([(1, 3), (3, 2), (2, 1)],key=itemgetter(1))https://stackoverflow.com/questions/10213994
复制相似问题