zoukankan      html  css  js  c++  java
  • 在python中对元祖进行排序

    在python里你可以对一个元组进行排序。例子是最好的说明:

    >>> items = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
    >>> sorted(items)
    [(0, 'B'), (0, 'a'), (1, 'A'), (1, 'B'), (2, 'A')]
    

    默认情况下内置的sortsorted函数接收的参数是元组时,他将会先按元组的第一个元素进行排序再按第二个元素进行排序。 然而,注意到结果中(0, 'B’)(0, 'a')的前面。这是因为大写字母B的ASCII编码比a小。然而,假设你想要一些更人性的排序并且不关注大小写。你或许会这么做:

    >>> sorted(items, key=str.lower)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: descriptor 'lower' requires a 'str' object but received a 'tuple'
    

    我们将会得到一个错误,因为他不能正确处理元组的第一部分。(注:原文作者估计想说元组中第一项是数字,不能使用lower这个方法;正确的原因提示的很明显了,是因为你传递的是一个元组,而元组是没有lower这个方法的)

    我们可以试着写一个lambda函数(eg.sorted(items, key=lambda x: x.lower() if isinstance(x, str) else x)),他将不会工作因为你只处理了元组的一个元素。(注:同上面,作者这么做必然是错的,思考给这个lambda传一个元组,返回的是什么?)

    言归正传,下面就是你应该怎么做的方法。一个lambda,它会返回一个元组:

    >>> sorted(items, key=lambda x: (x[0], x[1].lower()))
    [(0, 'a'), (0, 'B'), (1, 'A'), (1, 'B'), (2, 'A')]

    我确信你知道你可以倒序排列,仅仅使用sorted(items, reverse=True, …),但是你怎么根据关键字来进行不同的排序?

    使用lambda函数返回元组的技巧,下面是一个我们排序一个稍微高级的数据结构:

    >>> peeps = [{'name': 'Bill', 'salary': 1000}, {'name': 'Bill', 'salary': 500}, {'name': 'Ted', 'salary': 500}]
    

    现在,使用lambda函数返回一个元组的特性来排序:

    >>> sorted(peeps, key=lambda x: (x['name'], x['salary']))
    [{'salary': 500, 'name': 'Bill'}, {'salary': 1000, 'name': 'Bill'}, {'salary': 500, 'name': 'Ted'}]
    

    很有意思,对吧?Bill 在Ted的前面,并且500在1000的前面。但是如何在相同的 name 下,对 salary 反向排序?很简单,对它取反:

    >>> sorted(peeps, key=lambda x: (x['name'], -x['salary']))
    [{'salary': 1000, 'name': 'Bill'}, {'salary': 500, 'name': 'Bill'}, {'salary': 500, 'name': 'Ted'}]
  • 相关阅读:
    HDU 3681 Prison Break 越狱(状压DP,变形)
    POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
    ZOJ 3471 Most Powerful (状压DP,经典)
    POJ 2288 Islands and Bridges (状压DP,变形)
    HDU 3001 Travelling (状压DP,3进制)
    POJ 3311 Hie with the Pie (状压DP)
    POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
    FZU 2204 7
    POJ 3254 Corn Fields (状压DP,轮廓线DP)
    ZOJ 3494 BCD Code (数位DP,AC自动机)
  • 原文地址:https://www.cnblogs.com/ellisonzhang/p/10359057.html
Copyright © 2011-2022 走看看