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]]