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

use*_*19o 5 python sorting list python-2.7

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

我有一个像这样的元组列表。它是由 OpenCV 霍​​夫圆检测获得的。

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)]
Run Code Online (Sandbox Code Playgroud)

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

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

我可以单独进行这种排序。

xS=sorted(correctC,key=lambda correctC: correctC[0])
Run Code Online (Sandbox Code Playgroud)

这有点根据x值

yS=sorted(correctC,key=lambda correctC: correctC[1])
Run Code Online (Sandbox Code Playgroud)

这是根据 y 值排序。

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

我正在使用 Python 2.7

egu*_*aio 7

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

correctC.sort()
Run Code Online (Sandbox Code Playgroud)

如果您想更明确,请按照其他答案的说明进行操作:

correctC.sort(key=lambda t: (t[0], t[1]))
Run Code Online (Sandbox Code Playgroud)


tru*_*512 4

据我所知,这有帮助:

sorted(correctC, key=lambda correctC:[correctC[0],correctC[1]])
Run Code Online (Sandbox Code Playgroud)

排序结果:

[(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)]
Run Code Online (Sandbox Code Playgroud)

  • 编写 lambda 的方式更简洁,因为 OP 使用 Python 2:`key= lambda (x, y, z): (x, y)`。或者 Python 3 的“lambda tup: tup[:2]”。 (3认同)
  • 对于 lambda 参数来说,“ CorrectC” 是一个不好的名称,因为您为列表及其元素重复使用相同的变量名称。(不过,我发现这个名字的选择来自于问题本身。) (2认同)
  • @user119o:“以上 2 个元组未根据 y 值正确排序” - 是的,因为它们是按 x 值排序的。图片中的圆圈未按完美的列排列。如果您想检测近似的网格结构并按该结构对圆进行排序,您将需要比按两个键排序更复杂的东西。 (2认同)