使用多个键对Python列表进行排序

时间:2017-04-13 17:17:14

标签: python python-2.7 list sorting

我已经搜索了很多时间。我对使用关键参数进行排序有了一些想法。

我有一个像这样的元组列表。它是通过OpenCV Hough Circle检测得到的。

correctC = [(298, 172, 25), (210, 172, 25), (470, 172, 25), (386, 172, 22), (648, 172, 25), (384, 44, 22), (558, 110, 22), (562, 170, 25), (382, 108, 25), (734, 172, 25), (126, 172, 24), (646, 44, 22), (296, 110, 23), (126, 234, 26), (470, 236, 25), (296, 44, 25), (208, 108, 24), (38, 170, 25), (730, 110, 22), (730, 44, 25), (468, 110, 23), (468, 44, 25), (208, 44, 25), (124, 44, 22), (558, 44, 22), (36, 110, 24), (36, 44, 22), (298, 234, 26), (210, 236, 25), (648, 234, 25), (732, 234, 22), (562, 234, 26), (384, 236, 25), (38, 234, 26), (646, 110, 25), (124, 112, 27)]

它有3个值。中心坐标(x,y)和半径。

我需要使用它的x和y值对所有元组进行排序。

我可以单独进行排序。

xS=sorted(correctC,key=lambda correctC: correctC[0])

根据x值进行排序。

yS=sorted(correctC,key=lambda correctC: correctC[1])

根据y值进行排序。

如何使用一个表达式同时(根据x值和y值)?

我使用的是Python 2.7

5 个答案:

答案 0 :(得分:4)

在这种特殊情况下,如果您不关心如何安排具有相同x, y值的点,那么只需调用sort即可。元组按字典顺序排序。

correctC.sort()

如果你想更明确,就像另一个答案所说的那样:

correctC.sort(key=lambda t: (t[0], t[1]))

答案 1 :(得分:2)

从我所看到的情况来看,这有助于:

sorted(correctC, key=lambda correctC:[correctC[0],correctC[1]])

排序结果:

[(36, 44, 22), (36, 110, 24), (38, 170, 25), (38, 234, 26), (124, 44, 22), (124, 112, 27), (126, 172, 24), (126, 234, 26), (208, 44, 25), (208, 108, 24), (210, 172, 25), (210, 236, 25), (296, 44, 25), (296, 110, 23), (298, 172, 25), (298, 234, 26), (382, 108, 25), (384, 44, 22), (384, 236, 25), (386, 172, 22), (468, 44, 25), (468, 110, 23), (470, 172, 25), (470, 236, 25), (558, 44, 22), (558, 110, 22), (562, 170, 25), (562, 234, 26), (646, 44, 22), (646, 110, 25), (648, 172, 25), (648, 234, 25), (730, 44, 25), (730, 110, 22), (732, 234, 22), (734, 172, 25)]

答案 2 :(得分:2)

为什么你需要提供钥匙?元组按字典顺序排序("字典顺序")默认情况下。将比较第一个元素。如果它们相同,那么将比较每个元组的第二个元素,依此类推。意味着第一个元素被比较,如果它们是相同的,那么转到下一个元素(基本上"字典排序")。如果您依赖于此,您将得到您想要的,除非两个圆具有相同的中心,然后它们也将按半径排序。

答案 3 :(得分:2)

对于被

组合困惑的人
  • 不明确的问题
  • 接受的答案
  • OP user119o的评论

看起来OP想要这样的东西:

sortedC = sorted(correctC)
for index in range(0, len(sortedC), 4):
    sortedC[index:index + 4] = sorted(sortedC[index:index + 4], key=lambda x: x[1])

第二列元组显示了预期的输出(应该包含在问题中):

 0  ( 36,  44,  22)  ( 36,  44,  22)  
 1  ( 36, 110,  24)  ( 36, 110,  24)  
 2  ( 38, 170,  25)  ( 38, 170,  25)  
 3  ( 38, 234,  26)  ( 38, 234,  26)  
 4  (124,  44,  22)  (124,  44,  22)  
 5  (124, 112,  27)  (124, 112,  27)  
 6  (126, 172,  24)  (126, 172,  24)  
 7  (126, 234,  26)  (126, 234,  26)  
 8  (208,  44,  25)  (208,  44,  25)  
 9  (208, 108,  24)  (208, 108,  24)  
10  (210, 172,  25)  (210, 172,  25)  
11  (210, 236,  25)  (210, 236,  25)  
12  (296,  44,  25)  (296,  44,  25)  
13  (296, 110,  23)  (296, 110,  23)  
14  (298, 172,  25)  (298, 172,  25)  
15  (298, 234,  26)  (298, 234,  26)  
16  (382, 108,  25)  (384,  44,  22)  True
17  (384,  44,  22)  (382, 108,  25)  True
18  (384, 236,  25)  (386, 172,  22)  True
19  (386, 172,  22)  (384, 236,  25)  True
20  (468,  44,  25)  (468,  44,  25)  
21  (468, 110,  23)  (468, 110,  23)  
22  (470, 172,  25)  (470, 172,  25)  
23  (470, 236,  25)  (470, 236,  25)  
24  (558,  44,  22)  (558,  44,  22)  
25  (558, 110,  22)  (558, 110,  22)  
26  (562, 170,  25)  (562, 170,  25)  
27  (562, 234,  26)  (562, 234,  26)  
28  (646,  44,  22)  (646,  44,  22)  
29  (646, 110,  25)  (646, 110,  25)  
30  (648, 172,  25)  (648, 172,  25)  
31  (648, 234,  25)  (648, 234,  25)  
32  (730,  44,  25)  (730,  44,  25)  
33  (730, 110,  22)  (730, 110,  22)  
34  (732, 234,  22)  (734, 172,  25)  True
35  (734, 172,  25)  (732, 234,  22)  True

如果第四列中有True,则预期输出与sorted(correctC)不同。

答案 4 :(得分:1)

假设你想按原点的距离排序,这就是你想要的:

import math

sortedC = sorted(correctC, 
                 cmp=lambda lhs, rhs: cmp(math.sqrt(lhs[0] ** 2 + lhs[1] ** 2),
                                          math.sqrt(rhs[0] ** 2 + rhs[1] ** 2)))