如何像这样对元组排序?

2024-05-23 17:14:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

但它不起作用。你知道吗

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


Tags: lambdakeytrue列表datawith方式sort
3条回答

下面是一个使用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]]

据我所知,sort函数不能满足您的需要。排序算法假定您没有更改关于如何在每个其他位置比较元素的规则。你知道吗

这里有一个O(N^2)算法来做你想做的事情:

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

coordinate = 0
sorted_data = []
while data:
    largest = max(data, key=lambda x: x[coordinate])
    sorted_data.append(largest)
    data.pop(data.index(largest))
    coordinate = (coordinate + 1) % 2

print(sorted_data)

试试这个:

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

相关问题 更多 >