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

ドキュメントの比較の説明を参照してください。

同じタイプのオブジェクトの比較は、タイプによって異なります。

  • タプルとリストは、対応する要素の比較を使用して辞書的に比較されます。これは、等しいと比較するには、各要素が等しい必要があり、2 つのシーケンスが同じ型で同じ長さでなければならないことを意味します。

    等しくない場合、シーケンスは最初の異なる要素と同じ順序になります。たとえば、cmp([1,2,x], [1,2,y]) は cmp(x,y) と同じものを返します。対応する要素が存在しない場合は、短いシーケンスが最初に並べられます (たとえば、[1,2] < [1,2,3])。

于 2013-01-03T08:16:47.303 に答える
1

cmpへの引数の使用は避けるべきsortです: Python 3.x にアップグレードしたい場合、もはや存在しないことがわかります。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 に答える