难以使用itemgetter对元组进行排序

时间:2013-08-16 18:42:45

标签: python sorting python-2.7

我是Python的新手,因为屏幕名称证明了这一点。我试图对元组列表进行排序,在列表中考虑(x,y)对并遇到问题。我的目标是通过x变量按升序对元组列表进行排序,然后排序

我在http://wiki.python.org/moin/HowTo/Sorting/调查了HowToSort上的wiki,并认为我会尝试使用运算符模块和 itemgetter 函数作为密钥。

简单的sorted()函数可以对元组进行排序,但是当你想要一个索引升序和一个升序时,我就迷失了。这是代码:

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)]

我很明显,不了解itemgetter功能,所以任何帮助都会受到赞赏。

另外,关于如何对(x,y)对进行两种排序的任何想法?我希望避免使用lambda解决方案,但我确信这就是它的发展方向。感谢。

1 个答案:

答案 0 :(得分:2)

-0 0 相同。此外,负指数与itemgetter()具有不同的含义; not 意味着值被否定。

改为使用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 中获取项目:

>>> end = itemgetter(-1)
>>> end([1, 2, 3])
3

itemgetter()永远不会修改检索到的项目,当然也不会否定它。

请注意,itemgetter()只是一种方便的方法,你没有 来使用它,对于更复杂的排序顺序,自定义函数或lambda是更好的选择。