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

22

我有一个元组列表:

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轴上移动某些东西,我必须浏览整列,这可能会导致我无法解决的可怕问题)。

如何按照这种方式对元组进行排序?

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

但这并不是按照它们的第一个元素进行排序,而是按照它们的第二个元素进行排序,然后再按照第一个元素排序。这是你想要的吗? - David Robinson
我认为OP的意思是第一个元素应该是索引为1的元素 - inspectorG4dget
我指的是每个元组的第一个索引(现在我有点困惑,但下面的最终列表是我想要实现的“排序”)。 - Ericson Willians
self.gridKeys.sort(key=lambda x: x[1]) - David Robinson
3个回答

32
您可以使用sort函数的key参数,对元组进行排序。 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将用于第二个元组。


5

这应该就能达到效果了。

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

3

虽然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按从右到左的字典顺序进行排序。


我发现他的回答并不完全是我想要的,但我已经找到了如何使用它的方法。同时使用[0]和[1]。self.gridKeys.sort(key=lambda x: x[0]) self.gridKeys.sort(key=lambda x: x[1])我会分析你的版本,谢谢 :)。 - Ericson Willians
我发现你的版本比同时使用[0]和[1]更加优雅,所以我正在使用它 :)。 - Ericson Willians

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接