2013-01-03 36 views
1

有没有一种方法来排序列表中的第一个x,比y和z。我不知道如果我的代码将做到这一点:(CH与attribut left_edge一个对象)python:类对象的多维排序

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) 

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

回答

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)] 

见的比较说明在the documentation

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

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

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

+0

,所以我可以简单地写'ch.sort(CMP =拉姆达X,Y:CMP(x.left_edge,y.left_edge )''它会做我想要的吗? – Christian

+0

@Christian试试看看! – katrielalex

1

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

如果,因为它出现的left_edge属性是一个简单的列表或序列然后就直接使用它作为键值,它应该所有的工作。如果是一些不寻常的是标化的,但不比较然后生成元组:

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