Python 如何像这样对元组排序?

Python 如何像这样对元组排序?,python,sorting,lambda,Python,Sorting,Lambda,data=[(2,2)、(0,5)、(8,0)、(9,8)、(7,14)、(13,12)、(14,13)] 我希望此元组列表按如下方式排序: data=[(14,13)、(7,14)、(13,12)、(9,8)、(8,0)、(0,5)、(2,2)] 次序如下: [ [(coordinates with largest X)],[(coordinates with largest Y)], [(coordinates with second largest X)], [(coordinates w

data=[(2,2)、(0,5)、(8,0)、(9,8)、(7,14)、(13,12)、(14,13)]

我希望此元组列表按如下方式排序:

data=[(14,13)、(7,14)、(13,12)、(9,8)、(8,0)、(0,5)、(2,2)]

次序如下:

[ [(coordinates with largest X)],[(coordinates with largest Y)], [(coordinates with second largest X)], [(coordinates with second largest Y)], [(Third Largest X)], [(Third Largest y)] ... and so on ]
我试着用

data.sort(key=lambda x:x[0],reverse=True)
首先,然后

data.sort(key=lambda x:x[1],reverse=True)
但它不起作用

你觉得我该怎么办?
请帮助

我不太确定我是否理解您的意图(如果坐标同时具有最大的X和第二大的Y,会发生什么情况?)。看看您的示例,它似乎是按
max(X,Y)
排序的,因此,如果这就是您要查找的内容:

data.sort(key=lambda x:max(x),reverse=True)
或者类似“按
max(X,Y)
排序,但按X的最大值打破联系”:


据我所知,排序函数不能做你想做的事情。排序算法假定您没有更改关于如何在每个其他位置比较元素的规则

下面是一个O(N^2)算法,用于做您想做的事情:

data=[(2,2)、(0,5)、(8,0)、(9,8)、(7,14)、(13,12)、(14,13)]
坐标=0
已排序的_数据=[]
而数据:
最大=最大(数据,键=λx:x[坐标])
已排序的\u数据。追加(最大)
pop(数据索引(最大))
坐标=(坐标+1)%2
打印(已排序的数据)
试试这个:

sorted(data, key=lambda x:(max(x),x[0]),reverse=True) 
# [(14, 13), (7, 14), (13, 12), (9, 8), (8, 0), (0, 5), (2, 2)]

这里有一个使用Numpy的解决方案:

import numpy as np

data = [ (2,2), (0,5), (8,0), (9,8), (7,14), (13,12), (14,13) ]

d = np.array(data)

d_xy = [np.argsort(d[:, 0])[::-1],
        np.argsort(d[:, 1])[::-1]]

idx_xy = [0, 0] 

alternator = 0

order = []

for k in range(d.shape[0]):

    idx = idx_xy[alternator]

    while (d_xy[alternator][idx] in order):

        idx += 1

    order.append(d_xy[alternator][idx])
    alternator = 1 - alternator
    idx_xy[alternator] = idx

print(d[order])
结果:

[[14 13]
 [ 7 14]
 [13 12]
 [ 9  8]
 [ 8  0]
 [ 0  5]
 [ 2  2]]

您打印的预期数据既不是使用
X
也不是使用
Y
@Prudhvi排序的,预期输出似乎与您文章的其余部分相矛盾。我还认为,对元组进行排序可能并不总是可能的,例如,
[[(最大X的坐标)],[(最大Y的坐标)],…
如果第二名X超过了最大Y(以及其他子情况)。例如:[(2,2),(0,5),(8,0),(9,8),(7,9),(13,8),(14,7)],而这似乎有效(即使有重复的元组)它似乎不是
O(n)
。将n增加10(
n->(121201220012000))
我得到的次数增加了
15x,58x,166x
。这对我来说是可以的,只要它能工作……
数据=[(random.randint(1100000),random.randint(1100000))在范围内(n)]
很好。我的意思是N^2。它就像简单的排序算法,而不是Nlog(N)排序算法。
[[14 13]
 [ 7 14]
 [13 12]
 [ 9  8]
 [ 8  0]
 [ 0  5]
 [ 2  2]]