1

正如屏幕名称所证明的那样,我是 Python 新手。我试图对元组列表进行排序,在列表中考虑 (x,y) 对并遇到问题。我的目标是先按 x 变量升序对元组列表进行排序,然后再排序

我在http://wiki.python.org/moin/HowTo/Sorting/上调查了关于 HowToSort 的 wiki,并认为我会尝试将operator模块和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 解决方案,但我确信这就是它的发展方向。谢谢。

4

1 回答 1

2

-0和 是一样0。此外,负指数与itemgetter(); 这并不意味着这些值被否定。

使用 alambda代替:

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

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

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

于 2013-08-16T18:45:50.687 回答