Description

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

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

Input

第一行为一个整数n(1

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的参数是按排序优先级排列的列表下标或字典索引*④

参考文献:

①(多级排序)

②(lambda表达式)

③(itemgetter函数)

④(sort、sorted高级排序)