作者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
1F:推 Arim:Thx:) 11/08 23:12
※ 编辑: uranusjr 来自: 114.32.81.146 (11/08 23:19)
2F:推 bob123:python排序的结果是lexical order的 所以不用用到4个sort 11/09 03:24
3F:→ bob123:lines.sort(key=lambda e:(e.p1.x,e.p1.y,e.p2.x,e.p2.y)) 11/09 03:26