1

有没有一种方法可以先对 x 的列表进行排序,然后再对 y 和 z 进行排序。我不确定我的代码是否会这样做:(ch 是具有属性 left_edge 的对象)

ch.sort(cmp=lambda x,y: cmp(x.left_edge[0], y.left_edge[0]))
ch.sort(cmp=lambda x,y: cmp(x.left_edge[1], y.left_edge[1]))
ch.sort(cmp=lambda x,y: cmp(x.left_edge[2], y.left_edge[2]))

简单的例子:

unsorted
(1,1,2),(2,1,1),(1,1,3),(2,1,2)
sorted
(1,1,2),(1,1,3),(2,1,1),(2,1,2)

但我需要排序的对象......

4

2 回答 2

7

这正是默认tuple比较器的工作方式:

>>> l = [(1, 1, 2), (2, 1, 1), (1, 1, 3), (2, 1, 2)]
>>> sorted(l)
[(1, 1, 2), (1, 1, 3), (2, 1, 1), (2, 1, 2)]

请参阅文档中的比较描述:

相同类型的对象的比较取决于类型:

  • 元组和列表使用对应元素的比较按字典顺序进行比较。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须是相同的类型并且具有相同的长度。

    如果不相等,则序列的排序与其第一个不同的元素相同。例如, cmp([1,2,x], [1,2,y]) 返回与 cmp(x,y) 相同的结果。如果对应的元素不存在,则先排序较短的序列(例如,[1,2] < [1,2,3])。

于 2013-01-03T08:16:47.303 回答
1

你应该避免使用: 如果你想升级到 Python 3.x的cmp参数,你会发现它不再存在。sort请改用该key参数:

ch.sort(key=lambda x: x.left_edge)

如果看起来该left_edge属性只是一个列表或元组,那么只需将其直接用作键值,它应该都能正常工作。如果它是可下标但不比较的不寻常的东西,则构建元组:

ch.sort(key=lambda x: (x.left_edge[0],x.left_edge[1],x.left_edge[2]))
于 2013-01-03T10:42:50.610 回答