2005-08-16 元组排序
问题
请问如何将二维的元组排序 比如t1=((a1,b1),(a2,b2),(a3,b3),),a1,b1...可能是数字、英文字母或者中文等 现要求根据第一个元素或者第二个元素按照某种规律(比如大小)排序,生成新的元组或者list 请问各位有什么好的办法?
Py2.4
flyaflya wrote: > 如果是2.4可以这样,速度快些: 既然是考虑到速度,下面我介绍一下在python中如何对sort进行速度优化。 > c.sort(key = lambda x:x[0]) 如果是对x[0]排序,就没有必要给key了,直接c.sort()就ok。 python内置的sort算法效率相当高。 > c.sort(key = lambda x:x[1]) 在需要考虑运行效率的情况下,用下面的方法比使用lambda效率更高: import operator c.sort(key=operator.itemgetter(1))
Py2.3
> 2.3版没有这个参数 在2.4以前版本的python中,可以使用Guido van Rossum建议的Schwartzian Transform来提高运行效率: def sortby(somelist, n): nlist = [(x[n], x) for x in somelist] nlist.sort() return [val for (key, val) in nlist] 或者sort in place: def sortby_inplace(somelist, n): somelist[:] = [(x[n], x) for x in somelist] somelist.sort() somelist[:] = [val for (key, val) in somelist] return 因此在需要考虑运行效率的情况下(注意限定条件!在正常的情况下,以代码可读 性为最优先),对于OP的问题 > 请问如何将二维的元组排序 > 比如t1=((a1,b1),(a2,b2),(a3,b3),),a1,b1...可能是数字、英文字母或者中文等 > 现要求根据第一个元素或者第二个元素按照某种规律(比如大小)排序,生成新的元组或者list 1. 在python 2.4以前版本中: 1) 如果是对a1, a2... 排序: list1 = list(t1) list1.sort() return list1 2) 如果是对b1, b2... 排序: return sortby(t1, 1)
更高版本
2. 在python 2.4+版本中: 1) 如果是对a1, a2... 排序: return sorted(t1) 2) 如果是对b1, b2... 排序: import operator return sorted(t1, key=operator.itemgetter(1))
更多关于python性能优化的技巧,可以看wiki.python.org上的一篇文章:
-- Qiangning Hong