|
⇤ ← Revision 1 as of 2005-08-16 06:18:50
Size: 2375
Comment:
|
Size: 2456
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 2: | Line 2: |
| == 问题 == | |
| Line 10: | Line 11: |
| == Py2.4 == | |
| Line 27: | Line 29: |
| }}} | |
| Line 28: | Line 31: |
| == Py2.3 == {{{ |
|
| Line 64: | Line 69: |
| }}} | |
| Line 65: | Line 71: |
| == 更高版本 == {{{ |
|
| Line 76: | Line 84: |
| }}} | |
| Line 79: | Line 87: |
| http://wiki.python.org/moin/PythonSpeed/PerformanceTips | * http://wiki.python.org/moin/PythonSpeed/PerformanceTips |
| Line 83: | Line 91: |
| }}} |
2005-08-16 元组排序
问题
[wiki:PyCNmail/2005-August/014430.html 关于元组的排序]
请问如何将二维的元组排序 比如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
