zoukankan      html  css  js  c++  java
  • 【Python】多级比较的两种方法

    Description

    大家都知道在电商网站上买东西时,网站会根据我们的搜索条件给出非常多的商品。这些商品会以依据某一种排序规则进行排序,依次呈现在我们面前。现在某电商网站关于书籍的排序依据有这么几项,综合、销量、出版时间、价格、用户评分。假设综合排名的规则为:首先看价格,价格低的排名靠前,如果价格相同,则看出版时间,出版的晚的排名靠前,如果这两项都相同则看销量,销量大的靠前,如果前三项均相同,最后看用户评分,用户评分高的排名靠前。

    请依据此规则写一段给各个书按综合排名的程序。

    Input

    第一行为一个整数n(1<n<100),后面是n行书籍的数据,共7列,每列之间以空格分隔。其中第一列为书名(长度小于60且仅包含大写字母和小写字母的字符串),第二列到第七列均为大于等于0的整数,分别代表该书的销量、出版时间的年、月、日、价格和用户评分。

     

    Output

    n行,每行输出一本书的信息,与输入时格式一致(测试数据中保证没有排名一样的书籍,且所有整数均可以用int存储)。

    Sample Input Copy

    3
    CPrimerPlus 3000 2013 12 6 60 44
    ComputerSystemsAProgrammersPerspective 8000 2015 3 12 156 39
    TheCProguammingLanguage 50000 1978 2 22 5 46

    Sample Output Copy

    TheCProguammingLanguage 50000 1978 2 22 5 46
    CPrimerPlus 3000 2013 12 6 60 44
    ComputerSystemsAProgrammersPerspective 8000 2015 3 12 156 39


    Python第四次Oj有这么一个题。默认的sort函数会先对第一个比较,如果采用嵌套条件进行排序的话太过繁琐,人看着这代码也感觉有点晕。想起sort函数有一个key参数可以调用返回迭代对象的函数,所以我想应该有方法可以通过key参数实现多级比较。查阅资料后发现以下两种方法。

    1.lambda返回一个元组

    因为sort函数是安装list中数据的先后顺序进行排序的;因此使用lambda将list中数据的位置进行调换就可以对数据安装某些位置的排序。
    如果需要对python的list进行多级排序。有如下的数据:
     
    list_num = [[12,3],[18,34],[18,10],[12,45],[18,10],[8,34]]
     
    需要从小到大的排序。先比较第一个数,如果第一个数相等的话比较第二个数。代码如下:
     
    print(sorted(list_num))
    //OUTPUT:[[8, 34], [12, 3], [12, 45], [18, 10], [18, 10], [18, 34]]
    #先用第二个数排序,若相等再用第一个数排序
    print(list_num, key = lambda x:(int(x[0]),int(x[1])))
    //output:[[12, 3], [18, 10], [18, 10], [8, 34], [18, 34], [12, 45]]*①
     

    lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。lambda是一个表达式而不是一个语句。它能够出现在Python语法不允许def出现的地方。作为表达式,lambda返回一个值(即一个新的函数)。lambda用来编写简单的函数,而def用来处理更强大的任务。

     例:lambda的使用【1】

      1、一般的形式

        f = lambda x, y, z :x+y+z

        print f(1,2,3)

        #output:6 *②

     

    2.itemgetter

    operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号。看下面的例子

    例:

    from operator import itemgetter

    a = [1,2,3] 

    b=operator.itemgetter(1,0)  //定义函数b,获取对象的第1个域和第0个的值
    >>> b(a) 
    (2, 1)

    要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。*③

    例:

    sorted(student_tuples, key=itemgetter(1,2))

    itemgetter的参数是按排序优先级排列的列表下标或字典索引*④

    参考文献:

    ①https://blog.csdn.net/w417950004/article/details/86253721(多级排序)

    ②https://www.cnblogs.com/mxh1099/p/5386529.html(lambda表达式)

    ③https://www.cnblogs.com/zhoufankui/p/6274172.html(itemgetter函数)

    ④https://blog.csdn.net/jb19900111/article/details/50649932(sort、sorted高级排序)

  • 相关阅读:
    mybatis 梳理9--别名
    mybatis 梳理8--多个参数 @Param
    mybatis 梳理7--map的使用 (很好用)
    mybatis 梳理6--模糊查询
    mybatis 梳理5-- 增删改查 基于注解 (少)
    mybatis 梳理4--增删改查 基于配置文件(多)
    mybatis 梳理3--搭建环境 小栗子 结合 梳理10 复习
    mybatis 梳理2--代理设计模式 静态代理、动态代理(Proxy) (懵)
    mybatis 梳理1--文档官网、简介、持久化、持久层、持久层框架
    梳理5--核心配置文件pom 基础配置、构建配置、插件(记得!)、区别dependencies 和 dependencyManagement
  • 原文地址:https://www.cnblogs.com/protectione055/p/11723566.html
Copyright © 2011-2022 走看看