描述
第一行输入一个正整数 N,随后的N 行各输入一个人的姓名和年龄,中间用空格分隔(形如 “Tom 18” ),将字符串转为形如 {“name”:”Tom”,”age”:18} 的字典,按顺序加入到列表中,得到一个元素为字典的列表,分别根据年龄和姓名对其排序输出。
输入格式
第一行输入一个正整数 N
随后的N 行各输入一个形如 “Tom  18” 的字符串
输出格式
根据姓名排序的列表
根据年龄排序的列表
第一行输入一个正整数 N,随后的N 行各输入一个人的姓名和年龄,中间用空格分隔(形如 “Tom 18” )
n = int(input())ls = [] # 创建空列表for i in range(n):ls.append(input().split()) # 将输入根据空格切分成列表后加入到列表ls中print(ls) # 输出查看列表
输入:
4
Tom 18
Jerry 47
Cat 20
Doge 33
输出:
[[‘Tom’, ‘18’], [‘Jerry’, ‘47’], [‘Cat’, ‘20’], [‘Doge’, ‘33’]]
题目要求将字符串转为形如 {“name”:”Tom”,”age”:18} 的字典,按顺序加入到列表中,得到一个元素为字典的列表
n = int(input())ls = []for i in range(n):x = input().split() # 输入切分为列表ls.append({"name":x[0],"age":int(x[1])}) # 构建题目要求样式的字典元素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 指定排序关键字进行排序输出了,题目要求分别根据姓名和年龄对其排序输出。
n = int(input())ls = []for i in range(n):x = input().split()ls.append({"name":x[0],"age":int(x[1])})print(sorted(ls,key=lambda x: x['name'])) # 按姓名排序输出print(sorted(ls,key=lambda x: x['age'])) # 按年龄排序输出
另一种思路
n = int(input())ls = []s = ('name', 'age')for i in range(n):x = input().split() # 切分,['Tom', '18']temp = zip(s,x) # 将元组 s 与列表 ['Tom', '18']中的元素按位置组合# print(list(temp)) # [('name', 'Tom'), ('age', '18')]ls.append(dict(temp)) # 将 zip 对象转字典后加到入列表末尾print(ls) # [{'name': 'Tom', 'age': '18'}, {'name': 'Jerry', 'age': '47'}, {'name': 'Cat', 'age': '20'}, {'name': 'Doge', 'age': '33'}]print(sorted(ls,key=lambda x: x['age']))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’}]
发现存在一个问题,年龄的数据是字符串,题目要求转为整数进行存储,需要进一步处理,可以应用列表推导式对列表中的字典元素里的值进行更新,代码如下:
[x.update(age = int(x['age'])) for x in ls] # 将字典键age的值更新为其转为整数的值
完整参考代码如下:
n = int(input())ls = []s = ('name', 'age')for i in range(n):x = input().split() # 切分,['Tom', '18']temp = zip(s,x) # 将元组 s 与列表 ['Tom', '18']中的元素按位置组合# print(list(temp)) # [('name', 'Tom'), ('age', '18')]ls.append(dict(temp)) # 将 zip 对象转字典后加到入列表末尾print(ls) # [{'name': 'Tom', 'age': '18'}, {'name': 'Jerry', 'age': '47'}, {'name': 'Cat', 'age': '20'}, {'name': 'Doge', 'age': '33'}][x.update(age = int(x['age'])) for x in ls]print(sorted(ls,key=lambda x: x['age']))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}]
代码可以精简一下:
n = int(input())ls = [dict(zip(('name','age'),input().split())) for i in range(n)][x.update(age = int(x['age'])) for x in ls] # 将字典键age的值更新为其转为整数的值print(sorted(ls,key=lambda x: x['age'])) # 按年龄排序输出print(sorted(ls,key=lambda x: x['name'])) # 按姓名排序输出
