正如屏幕名称所证明的那样,我是Python的新手。我试图对一个元组列表进行排序,在列表中考虑(x,y)对,然后遇到了一个问题。我的目标是首先按照x变量的升序排序元组列表,然后排序。
我在HowToSort上研究了http://wiki.python.org/moin/HowTo/Sorting/上的wiki,并想尝试使用操作符模块和itemgetter函数作为关键。
简单的排序()函数可以很好地对元组进行排序,但是当您想要一个索引升序和一个升序时,我就迷路了。以下是代码:
from operator import itemgetter, attrgetter
ItemList = [(1,7),(2,1),(1,5),(1,1)]
# Want list sorted with X values descending, then y values ascending
# expected [(2, 1), (1, 1), (1,5), (1, 7)]
print
print ' Input:', ItemList
print 'Output1:',sorted(ItemList, reverse = True)
print
print ' Input:', ItemList
print 'Output2:', sorted(ItemList, key = itemgetter(-0,1))
print
print ' WANTED:', '[(2, 1), (1, 1), (1,5), (1, 7)]'具有以下输出:
Input: [(1, 7), (2, 1), (1, 5), (1, 1)]
Output1: [(2, 1), (1, 7), (1, 5), (1, 1)]
Input: [(1, 7), (2, 1), (1, 5), (1, 1)]
Output2: [(1, 1), (1, 5), (1, 7), (2, 1)]
WANTED: [(2, 1), (1, 1), (1, 5), (1, 7)]显然,我不理解项目的功能,因此,如果有任何帮助,将不胜感激。
另外,对于如何在(x,y)对上进行这两种排序,有什么想法吗?我希望避免使用lambda解决方案,但我确信这就是它的发展方向。谢谢。
发布于 2013-08-16 18:45:50
-0和0是一样的。更重要的是,负指数与itemgetter()有不同的含义;它并不意味着值被否定。
使用lambda代替:
sorted(ItemList, key=lambda item: (-item[0], item[1]))演示:
>>> ItemList = [(1,7),(2,1),(1,5),(1,1)]
>>> sorted(ItemList, key=lambda item: (-item[0], item[1]))
[(2, 1), (1, 1), (1, 5), (1, 7)]负索引从序列的末尾取项:
>>> end = itemgetter(-1)
>>> end([1, 2, 3])
3itemgetter()永远不会修改检索到的项,当然也不会否定它。
请注意,itemgetter()只是一种方便的方法,您不必使用它,对于更复杂的排序顺序,使用自定义函数或lambda是更好的选择。
https://stackoverflow.com/questions/18280087
复制相似问题