Re: [問題] sorting的問題

看板Python作者 (←這人是超級笨蛋)時間13年前 (2012/11/08 23:03), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串2/2 (看更多)
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

11/08 23:12, , 1F
Thx:)
11/08 23:12, 1F
※ 編輯: uranusjr 來自: 114.32.81.146 (11/08 23:19)

11/09 03:24, , 2F
python排序的結果是lexical order的 所以不用用到4個sort
11/09 03:24, 2F

11/09 03:26, , 3F
lines.sort(key=lambda e:(e.p1.x,e.p1.y,e.p2.x,e.p2.y))
11/09 03:26, 3F
文章代碼(AID): #1Gcycua9 (Python)
文章代碼(AID): #1Gcycua9 (Python)