2017-04-13 93 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)