Python论坛  - 讨论区

标题:[python-chinese] 关于元组的排序

2005年08月16日 星期二 09:43

watchsun watchsun at gmail.com
Tue Aug 16 09:43:00 HKT 2005

请问如何将二维的元组排序
比如t1=((a1,b1),(a2,b2),(a3,b3),),a1,b1...可能是数字、英文字母或者中文等
现要求根据第一个元素或者第二个元素按照某种规律(比如大小)排序,生成新的元组或者list
请问各位有什么好的办法?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050816/c504ebb3/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年08月15日 星期一 10:40

flyaflya flyaflyaa at gmail.com
Mon Aug 15 10:40:03 HKT 2005

如果是2.4可以这样,速度快些:
c.sort(key = lambda x:x[0])
c.sort(key = lambda x:x[1])
2.3版没有这个参数
  ----- Original Message ----- 
  From: watchsun 
  To: python-chinese at lists.python.cn 
  Sent: Tuesday, August 16, 2005 10:28 AM
  Subject: Re: [python-chinese] 关于元组的排序


  多谢楼上,看来要多看看文档,多多了解sort的用法


  在05-8-16,nicran <nicran at gmail.com> 写道:
    def mysort(a, b):
        return cmp(a[1], b[1])

    t1=((a1,b1),(a2,b2),(a3,b3))

    l1 = list(t1)

    # 根据第二个元素排序
    print l1.sort(mysoft)
    # 根据第一个元素排序
    print l1.sort()

    在 05-8-16,watchsun< watchsun at gmail.com> 写道:
    > 请问如何将二维的元组排序
    > 比如t1=((a1,b1),(a2,b2),(a3,b3),),a1,b1...可能是数字、英文字母或者中文等
    > 现要求根据第一个元素或者第二个元素按照某种规律(比如大小)排序,生成新的元组或者list
    > 请问各位有什么好的办法?
    > _______________________________________________ 
    > python-chinese list
    > python-chinese at lists.python.cn
    > http://python.cn/mailman/listinfo/python-chinese 
    >
    >
    >

    _______________________________________________
    python-chinese list
    python-chinese at lists.python.cn
    http://python.cn/mailman/listinfo/python-chinese







------------------------------------------------------------------------------


  _______________________________________________
  python-chinese list
  python-chinese at lists.python.cn
  http://python.cn/mailman/listinfo/python-chinese
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050815/7d48db2f/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年08月16日 星期二 09:51

Jason Liu telecomliu at gmail.com
Tue Aug 16 09:51:49 HKT 2005

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

如果说是list的话可以自己写个比较函数,然后sort()一下。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年08月16日 星期二 10:10

nicran nicran at gmail.com
Tue Aug 16 10:10:02 HKT 2005

def mysort(a, b):
    return cmp(a[1], b[1])    

t1=((a1,b1),(a2,b2),(a3,b3))

l1 = list(t1)

# 根据第二个元素排序
print l1.sort(mysoft)
# 根据第一个元素排序
print l1.sort()

在 05-8-16,watchsun<watchsun at gmail.com> 写道:
> 请问如何将二维的元组排序
> 比如t1=((a1,b1),(a2,b2),(a3,b3),),a1,b1...可能是数字、英文字母或者中文等
> 现要求根据第一个元素或者第二个元素按照某种规律(比如大小)排序,生成新的元组或者list
> 请问各位有什么好的办法? 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年08月16日 星期二 10:28

watchsun watchsun at gmail.com
Tue Aug 16 10:28:18 HKT 2005

多谢楼上,看来要多看看文档,多多了解sort的用法

在05-8-16,nicran <nicran at gmail.com> 写道:
> 
> def mysort(a, b):
> return cmp(a[1], b[1])
> 
> t1=((a1,b1),(a2,b2),(a3,b3))
> 
> l1 = list(t1)
> 
> # 根据第二个元素排序
> print l1.sort(mysoft)
> # 根据第一个元素排序
> print l1.sort()
> 
> 在 05-8-16,watchsun<watchsun at gmail.com> 写道:
> > 请问如何将二维的元组排序
> > 比如t1=((a1,b1),(a2,b2),(a3,b3),),a1,b1...可能是数字、英文字母或者中文等
> > 现要求根据第一个元素或者第二个元素按照某种规律(比如大小)排序,生成新的元组或者list
> > 请问各位有什么好的办法?
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050816/1e51eb2e/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年08月16日 星期二 13:21

Qiangning Hong hongqn at gmail.com
Tue Aug 16 13:21:05 HKT 2005

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

I'm usually annoyed by IDEs because, for instance, they don't use VIM
as an editor. Since I'm hooked to that, all IDEs I've used so far have
failed to impress me.
    -- Sybren Stuvel @ c.l.python

Get Firefox!
<http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号