如何根据元组的第一个元素排序列表?
我有一个包含元组的列表:
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), ...]
3 个回答
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从右到左进行字典序排序。
5
这样做就可以了
import operator
self.gridKeys.sort(key=operator.itemgetter(1))
33
你可以使用 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
进行比较。