python多级比较的两种方法

孤街浪徒 提交于 2019-12-02 02:14:54

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高级排序)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!