1. 2005-08-16 元组排序

关于元组的排序

请问如何将二维的元组排序
比如t1=((a1,b1),(a2,b2),(a3,b3),),a1,b1...可能是数字、英文字母或者中文等
现要求根据第一个元素或者第二个元素按照某种规律(比如大小)排序,生成新的元组或者list
请问各位有什么好的办法?

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))

> 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上的一篇文章:

http://wiki.python.org/moin/PythonSpeed/PerformanceTips

--
Qiangning Hong