描述

第一行输入一个正整数 N,随后的N 行各输入一个人的姓名和年龄,中间用空格分隔(形如 “Tom 18” ),将字符串转为形如 {“name”:”Tom”,”age”:18} 的字典,按顺序加入到列表中,得到一个元素为字典的列表,分别根据年龄和姓名对其排序输出。

输入格式

第一行输入一个正整数 N
随后的N 行各输入一个形如 “Tom 18” 的字符串

输出格式

根据姓名排序的列表
根据年龄排序的列表

第一行输入一个正整数 N,随后的N 行各输入一个人的姓名和年龄,中间用空格分隔(形如 “Tom 18” )

  1. n = int(input())
  2. ls = [] # 创建空列表
  3. for i in range(n):
  4. ls.append(input().split()) # 将输入根据空格切分成列表后加入到列表ls中
  5. print(ls) # 输出查看列表

输入:
4
Tom 18
Jerry 47
Cat 20
Doge 33
输出:
[[‘Tom’, ‘18’], [‘Jerry’, ‘47’], [‘Cat’, ‘20’], [‘Doge’, ‘33’]]
题目要求将字符串转为形如 {“name”:”Tom”,”age”:18} 的字典,按顺序加入到列表中,得到一个元素为字典的列表

  1. n = int(input())
  2. ls = []
  3. for i in range(n):
  4. x = input().split() # 输入切分为列表
  5. ls.append({"name":x[0],"age":int(x[1])}) # 构建题目要求样式的字典元素
  6. print(ls)

输入
4
Tom 18
Jerry 47
Cat 20
Doge 33
输出
[{‘name’: ‘Tom’, ‘age’: 18}, {‘name’: ‘Jerry’, ‘age’: 47}, {‘name’: ‘Cat’, ‘age’: 20}, {‘name’: ‘Doge’, ‘age’: 33}]
现在已经构建出题目要求的元素为字典的列表,可以使用 key 指定排序关键字进行排序输出了,题目要求分别根据姓名和年龄对其排序输出。

  1. n = int(input())
  2. ls = []
  3. for i in range(n):
  4. x = input().split()
  5. ls.append({"name":x[0],"age":int(x[1])})
  6. print(sorted(ls,key=lambda x: x['name'])) # 按姓名排序输出
  7. print(sorted(ls,key=lambda x: x['age'])) # 按年龄排序输出

另一种思路

  1. n = int(input())
  2. ls = []
  3. s = ('name', 'age')
  4. for i in range(n):
  5. x = input().split() # 切分,['Tom', '18']
  6. temp = zip(s,x) # 将元组 s 与列表 ['Tom', '18']中的元素按位置组合
  7. # print(list(temp)) # [('name', 'Tom'), ('age', '18')]
  8. ls.append(dict(temp)) # 将 zip 对象转字典后加到入列表末尾
  9. print(ls) # [{'name': 'Tom', 'age': '18'}, {'name': 'Jerry', 'age': '47'}, {'name': 'Cat', 'age': '20'}, {'name': 'Doge', 'age': '33'}]
  10. print(sorted(ls,key=lambda x: x['age']))
  11. print(sorted(ls,key=lambda x: x['name']))

输入:
4
Tom 18
Jerry 47
Cat 20
Doge 33
输出
[{‘name’: ‘Tom’, ‘age’: ‘18’}, {‘name’: ‘Jerry’, ‘age’: ‘47’}, {‘name’: ‘Cat’, ‘age’: ‘20’}, {‘name’: ‘Doge’, ‘age’: ‘33’}]
[{‘name’: ‘Tom’, ‘age’: ‘18’}, {‘name’: ‘Cat’, ‘age’: ‘20’}, {‘name’: ‘Doge’, ‘age’: ‘33’}, {‘name’: ‘Jerry’, ‘age’: ‘47’}]
[{‘name’: ‘Cat’, ‘age’: ‘20’}, {‘name’: ‘Doge’, ‘age’: ‘33’}, {‘name’: ‘Jerry’, ‘age’: ‘47’}, {‘name’: ‘Tom’, ‘age’: ‘18’}]
发现存在一个问题,年龄的数据是字符串,题目要求转为整数进行存储,需要进一步处理,可以应用列表推导式对列表中的字典元素里的值进行更新,代码如下:

  1. [x.update(age = int(x['age'])) for x in ls] # 将字典键age的值更新为其转为整数的值

完整参考代码如下:

  1. n = int(input())
  2. ls = []
  3. s = ('name', 'age')
  4. for i in range(n):
  5. x = input().split() # 切分,['Tom', '18']
  6. temp = zip(s,x) # 将元组 s 与列表 ['Tom', '18']中的元素按位置组合
  7. # print(list(temp)) # [('name', 'Tom'), ('age', '18')]
  8. ls.append(dict(temp)) # 将 zip 对象转字典后加到入列表末尾
  9. print(ls) # [{'name': 'Tom', 'age': '18'}, {'name': 'Jerry', 'age': '47'}, {'name': 'Cat', 'age': '20'}, {'name': 'Doge', 'age': '33'}]
  10. [x.update(age = int(x['age'])) for x in ls]
  11. print(sorted(ls,key=lambda x: x['age']))
  12. print(sorted(ls,key=lambda x: x['name']))

输入
4
Tom 18
Jerry 47
Cat 20
Doge 33
输出,第一行输出是未转为整数的,后两行的输出是转为整数后的排序输出
[{‘name’: ‘Tom’, ‘age’: ‘18’}, {‘name’: ‘Jerry’, ‘age’: ‘47’}, {‘name’: ‘Cat’, ‘age’: ‘20’}, {‘name’: ‘Doge’, ‘age’: ‘33’}]
[{‘name’: ‘Tom’, ‘age’: 18}, {‘name’: ‘Cat’, ‘age’: 20}, {‘name’: ‘Doge’, ‘age’: 33}, {‘name’: ‘Jerry’, ‘age’: 47}]
[{‘name’: ‘Cat’, ‘age’: 20}, {‘name’: ‘Doge’, ‘age’: 33}, {‘name’: ‘Jerry’, ‘age’: 47}, {‘name’: ‘Tom’, ‘age’: 18}]

代码可以精简一下:

  1. n = int(input())
  2. ls = [dict(zip(('name','age'),input().split())) for i in range(n)]
  3. [x.update(age = int(x['age'])) for x in ls] # 将字典键age的值更新为其转为整数的值
  4. print(sorted(ls,key=lambda x: x['age'])) # 按年龄排序输出
  5. print(sorted(ls,key=lambda x: x['name'])) # 按姓名排序输出