如何按第一个元素对元组列表进行排序?

时间:2014-04-05 03:58:28

标签: python list sorting tuples

我有一个元组列表:

self.gridKeys = self.gridMap.keys() # The keys of the instance of the GridMap (It returns the product of every possible combination of positions in the specified grid, in tuples.)
print self.gridKeys

self.gridKeys:

[(7, 3), (6, 9), (0, 7), (1, 6), (3, 7), (2, 5), (8, 5), (5, 8), (4, 0), (9, 0), (6, 7), (5, 5), (7, 6), (0, 4), (1, 1), (3, 2), (2, 6), (8, 2), (4, 5), (9, 3), (6, 0), (7, 5), (0, 1), (3, 1), (9, 9), (7, 8), (2, 1), (8, 9), (9, 4), (5, 1), (7, 2), (1, 5), (3, 6), (2, 2), (8, 6), (4, 1), (9, 7), (6, 4), (5, 4), (7, 1), (0, 5), (1, 0), (0, 8), (3, 5), (2, 7), (8, 3), (4, 6), (9, 2), (6, 1), (5, 7), (7, 4), (0, 2), (1, 3), (4, 8), (3, 0), (2, 8), (9, 8), (8, 0), (6, 2), (5, 0), (1, 4), (3, 9), (2, 3), (1, 9), (8, 7), (4, 2), (9, 6), (6, 5), (5, 3), (7, 0), (6, 8), (0, 6), (1, 7), (0, 9), (3, 4), (2, 4), (8, 4), (5, 9), (4, 7), (9, 1), (6, 6), (5, 6), (7, 7), (0, 3), (1, 2), (4, 9), (3, 3), (2, 9), (8, 1), (4, 4), (6, 3), (0, 0), (7, 9), (3, 8), (2, 0), (1, 8), (8, 8), (4, 3), (9, 5), (5, 2)]

排序后:

self.gridKeys = self.gridMap.keys() # The keys of the instance of the GridMap (It returns the product of every possible combination of positions in the specified grid, in tuples.)
self.gridKeys.sort() # They're dicts, so they need to be properly ordered for further XML-analysis.
print self.gridKeys

self.gridKeys:

[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]

每个元组的第一个元素是" x",第二个元素是" y"。我通过迭代和使用这些键移动列表中的对象(所以,如果我想在x轴上移动一些东西,我必须遍历所有列,这可能会导致一个可怕的问题,我&# 39;我无法解决。)

如何以这种方式对元组进行排序?:

[(1, 0), (2, 0), (3, 0), (4, 0), (5, 0), ...]

3 个答案:

答案 0 :(得分:17)

您可以使用key函数的sort参数来对元组进行排序。 key参数的功能是提出一个必须用来比较两个对象的值。因此,在您的情况下,如果您希望sort仅使用元组中的第一个元素,您可以执行类似这样的操作

self.gridKeys.sort(key=lambda x: x[0])

如果你只想使用元组中的第二个元素,那么

self.gridKeys.sort(key=lambda x: x[1])

sort函数会将列表中的每个元素传递给作为参数传递给key的lambda函数,它将使用它返回的值来比较列表中的两个对象。因此,在您的情况下,假设您在列表中有两个项目,如此

data = [(1, 3), (1, 2)]

如果你想按第二个元素排序,那么你会做

data.sort(key=lambda x: x[1])

首先它将(1, 3)传递给lambda函数,该函数返回索引1处的元素,即3,并且在比较期间将表示此元组。同样,2将用于第二个元组。

答案 1 :(得分:3)

这应该可以解决问题

import operator
self.gridKeys.sort(key=operator.itemgetter(1))

答案 2 :(得分:2)

虽然thefourtheye的解决方案在严格意义上是正确的,但它正是你在标题中要求的。它可能实际上不是你想要的。通过反转元组来进行排序可能会更好一些。

self.gridKeys.sort(key=lambda x:tuple(reversed(x)))

这迫使您订购如下:

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), ...]

而不是让第一个元素无序,如:

[(4, 0), (9, 0), (6, 0), (1, 0), (3, 0), ...]

使用时我得到的是:

self.gridKeys.sort(key=lambda x: x[1])

默认情况下,Python从左到右进行词典排序。有效地反转元组使得Python从右到左执行字典排序。