2017-04-13 91 views
2

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

我有这样的元组列表。它是通过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

+0

小于,等于,大于x和y的定义是什么?具体来说,哪个更少,(1,2,3)或(2,1,3),还是他们被认为是相等的排序?还是应该将x和y转换为极坐标,并使用长度进行排序? –

+0

'correctC'是lambda参数的错误名称,因为您正在重复使用列表及其元素的相同变量名称。 – user2357112

+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

由于OP使用Python 2:'key = lambda(x,y,z):(x,y)',所以更清晰地写入lambda。或'lambda tup:tup [:2]'for Python 3. – timgeb

+1

@timgeb这不就是元组的默认排序顺序吗? (除了你忽略了第三个元素。) –

+1

'correctC'是lambda参数的错误名称,因为您正在重复使用列表及其元素的相同变量名称。 (虽然我看到这个名字的选择来自于这个问题本身) – user2357112

2

为什么你需要在所有提供的关键?元组按默认顺序按字典顺序排列(“字典顺序”)。第一个元素将进行比较。如果它们相同,则将比较每个元组的第二个元素,依此类推。这意味着第一个元素进行比较,如果他们是相同的,然后去下一个元素(基本上是“字典顺序”)。如果你依靠这个,你会得到你想要的,除非两个圆圈有相同的中心,那么他们也将按半径排序。

3

在这种特殊情况下,如果您不关心x, y值如何排列,那么只需拨打sort即可完成此工作。元组按字典顺序排序。

correctC.sort() 

如果你想更明确的,只是做与其他答案告诉:

correctC.sort(key=lambda t: (t[0], t[1])) 
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))) 
+0

谢谢...我从你的回答中得到了很多想法。 其实我的想法是在你回答后想做什么。其实这不是按照距离排序...... 你可以在这张照片中看到我想要的内容: https://drive.google.com/file/d/0B53F0wBGnYhdWkRiN1pNVXNXYlE/view?usp=sharing – user119o

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)