描述

输入一系列动物名和其重量,重量单位可能是kg,也可能是t,动物名、与重量间空格分隔,重量数值与单位间无分隔。
按重量由小到大排序以二维列表形式输出。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入

每次输入一个动物名,以及其重量和单位,动物名与重量间用空格分隔,直接输入回车时结束输入。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输出

以二维列表形式输出,按重量由小到大升序排序。

直接输入回车时,解释器会接收到一个空字符串,所以可以通过判断输入是否为空字符串知道是否直接输入了回车。
循环输入,输入回车时结束可以用以下实现方法:

  1. while True: # 构建无限循环
  2. temp = input() # 输入一个字符串
  3. if temp == '': # 判断输入的是否为回车
  4. break # 输入回车时结束循环

将输入数据放入列表可以先创建一个空列表,在循环中用列表的append()方法依次将输入的字符串加入到列表中:

  1. ls = []
  2. while True:
  3. temp = input() # 判断输入的是否为回车
  4. ls.append(temp.split()) # 将接收的字符串根据空格切分,增加到列表中

输入
海豚 228kg
北极熊 0.75t
企鹅 35kg
海豹 0.35t
白鲸 1.35t
回车
输出
[[‘海豚’, ‘228kg’]]
[[‘海豚’, ‘228kg’], [‘北极熊’, ‘0.75t’]]
[[‘海豚’, ‘228kg’], [‘北极熊’, ‘0.75t’], [‘企鹅’, ‘35kg’]]
[[‘海豚’, ‘228kg’], [‘北极熊’, ‘0.75t’], [‘企鹅’, ‘35kg’], [‘海豹’, ‘0.35t’]]

从运行结果可以看到,每个循环为列表增加一个元素。
二维列表排序可以用key关键字指定根据第二个元素排序:

  1. ls = [['海豚', '228kg'], ['北极熊', '0.75t'], ['企鹅', '35kg'], ['海豹', '0.35t'], ['白鲸', '1.35t']]
  2. print(sorted(ls,key=lambda x:x[1]))

排序结果为:
[[‘海豹’, ‘0.35t’], [‘北极熊’, ‘0.75t’], [‘白鲸’, ‘1.35t’], [‘海豚’, ‘228kg’], [‘企鹅’, ‘35kg’]]
发现这是根据字符串进行的排序。
可以用一个条件表达式将单位去掉再转为浮点型:

  1. ls = [['海豚', '228kg'], ['北极熊', '0.75t'], ['企鹅', '35kg'], ['海豹', '0.35t'], ['白鲸', '1.35t']]
  2. print(sorted(ls,key=lambda x:float(x[1][:-1]) if x[-1] == 't' else float(x[1][:-2])))

排序结果为:
[[‘海豹’, ‘0.35t’], [‘北极熊’, ‘0.75t’], [‘白鲸’, ‘1.35t’], [‘企鹅’, ‘35kg’], [‘海豚’, ‘228kg’]]
此时排序依据是:
[[0.35], [ 0.75], [1.35], [ 35], [228]]
由于各动物重量单位不同,有’t’ 和’kg’两种,所以这个排序关键字并不能体现动物的真实重量的排序,需要进行一下换算,机以先定义一个函数完成单位的换算,函数的参数是表示动物重量的带单位的字符串,返回值为统一为公斤表示的重量数值。

  1. ls = [['海豚', '228kg'], ['北极熊', '0.75t'], ['企鹅', '35kg'], ['海豹', '0.35t'], ['白鲸', '1.35t']]
  2. def kgToT(weight):
  3. if weight[-1] == 't': # 如果单位是 't' 返回换算为公斤的重量
  4. return float(weight[:-1]) * 1000 # 切去最后一位,转浮点数乘1000,要注意单位为 't' 时,前面数值可能是浮点数,不能用int()
  5. else: # 否则,如果单位是 'kg' 直接返回重量
  6. return int(weight[:-2]) # 切去最后两位转整数
  7. print(sorted(ls,key=lambda x:kgToT(x[1])))

排序结果为:
[[‘企鹅’, ‘35kg’], [‘海豚’, ‘228kg’], [‘海豹’, ‘0.35t’], [‘北极熊’, ‘0.75t’], [‘白鲸’, ‘1.35t’]]
此时排序依据是:
[[35], [ 228], [350, [ 750], [1350]]
函数可以用条件表示式实现:

  1. def kgToT(weight):
  2. return float(weight[:-1]) * 1000 if weight[-1] == 't' else int(weight[:-2])

这种简单函数又可以写为匿名函数:

  1. lambda weight:float(weight[:-1]) * 1000 if weight[-1] == 't' else int(weight[:-2])

上面代码中传给 weight 实际是 ls[1],所以如果直接将lambda函数应用于sorted()时,需要做少许修改:

  1. ls = []
  2. while True: # 构建无限循环
  3. temp = input() # 输入一个字符串
  4. if temp == '': # 判断输入的是否为回车
  5. break # 输入回车时结束循环
  6. ls.append(temp.split()) # 将接收的字符串根据空格切分,增加到列表中
  7. print(sorted(ls,key=lambda weight:float(weight[1][:-1]) * 1000 if weight[1][-1] == 't' else int(weight[1][:-2])))
  8. # 排序 关键字是列表第2个元素的值,其值要根据最后一个字符是否为t判定其单位是否为吨,此时需转为公斤