Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 难以使用itemgetter对元组进行排序_Python_Sorting_Python 2.7 - Fatal编程技术网

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

Python 难以使用itemgetter对元组进行排序,python,sorting,python-2.7,Python,Sorting,Python 2.7,正如屏幕名称所证明的那样,我是Python新手。我试图对元组列表进行排序,在列表中考虑(x,y)对,但遇到了一个问题。我的目标是按照x变量的升序对元组列表进行排序,主要是,然后进行排序 我调查了HowToSort at上的wiki,并认为我会尝试使用操作符模块和itemgetter函数作为键 simple sorted()函数可以对元组进行精细排序,但是如果需要一个索引升序和一个索引升序,我就输了。代码如下: from operator import itemgetter, attrgetter

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

我调查了HowToSort at上的wiki,并认为我会尝试使用操作符模块和itemgetter函数作为键

simple 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解决方案,但我确信这就是问题所在。谢谢。

-0
0
是一回事。此外,负指数对
itemgetter()
有不同的含义;这并不意味着这些值是否定的

改用
lambda

sorted(ItemList, key=lambda item: (-item[0], item[1]))
演示:

负指数从序列末尾提取项目:

>>> end = itemgetter(-1)
>>> end([1, 2, 3])
3
itemgetter()
永远不会修改检索到的项,当然也不会否定它


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

如何使用
[(2,1)、(1,1)、(2,1)、(1,7)]
x
-值降序排序?您想要的输出毫无意义。我想你打错了,而是指
[(2,1)、(1,1)、(1,5)、(1,7)]
。是的,谢谢。我刚刚修好了,宾果!非常感谢。我就知道那是一只羔羊。我必须停止害怕羔羊@NewatPython:任何可调用的都可以,但是
lambda
在这里更方便。功能也可以达到同样的目的。
>>> end = itemgetter(-1)
>>> end([1, 2, 3])
3