作者uranusjr (←這人是超級笨蛋)
看板Python
標題Re: [問題] sorting的問題
時間Thu Nov 8 23:03:17 2012
http://www.python.org/dev/peps/pep-0008/#indentation
請盡量使用四個空格縮排
※ 引述《Arim (Arim5566)》之銘言:
: 各位版友好
: 如果我有一個point的class
: class point:
: def __init__(self,x,y):
: self.x=x
: self.y=y
: 以及一個Line的class
: class Line:
: def __init__(self,p1,p2):
: self.p1=p1
: self.p2=p2
sorted 和 list.sort 都保證 stable
也就是說如果兩個項目 key 值相等, 它們的先後順序不會因為排序而改變
所以最簡單的方法就是從最不重要的項目往前排回來
(為什麼是這樣就交給你自己想了)
: p1跟p2是Point的Instance
: 其中每個Line的instance的p1會比p2小(先比x再比y)
: 現在要排序一個放Line的instance的list
: 比較每個Line的instance也是先比p1再比p2
: 而每個Line的point(也就是p1跟p2)在比較的時候也是先比x再比y
: 例如排序四條Line之後會變成:
: l1 0 150 150 150 #格式為p1.x p1.y p2.x p2.y
: l2 150 0 150 150
: l3 150 150 150 600
: l4 150 150 600 150
這種時候用 lambda 會方便一點
http://codepad.org/GFV0g05v
(竟然不支援 new format print!超爛的!)
或者, Python 在比較大小的時候其實是呼叫物件的隱藏運算子函式
所以你可以直接 override 運算子函式達成運算子重載進而讓該物件能被排列
http://codepad.org/SnHpT4EX
其實好像只要 __lt__ 和 __gt__ 挑一個就夠了, 不過保險起見還是都寫
其他還有很多可以重載的, 有興趣可以自己 google Python operator overloading
量大的時候要用夜用...我是說, 資料量大的時候後面那種方式效率會比較好
自己照需求選用吧
Edit: 原 po 好像沒發現我程式碼貼錯, 趕快偷改XD
--
╱ ̄ ̄ ̄╲
▏
◢█◣ ▏
︻█︻█ ▏
成龍表示: 是喔...
′/ ‵ ▏
╰╯ █╱
ψQSWEET ◥︶█◤
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
推 Arim:Thx:) 11/08 23:12
※ 編輯: uranusjr 來自: 114.32.81.146 (11/08 23:19)
推 bob123:python排序的結果是lexical order的 所以不用用到4個sort 11/09 03:24
→ bob123:lines.sort(key=lambda e:(e.p1.x,e.p1.y,e.p2.x,e.p2.y)) 11/09 03:26