题目:第一行输入一个正整数N,随后的N行各输入一个人的姓名和年龄,中间用空格分隔(形如 "Tom 18"),将字符串转为形如 {"name":"Tom","age":18} 的字典,按顺序加入到列表中,得到一个元素为字典的列表,分别根据年龄和姓名对其升序排序输出。
样例输入:
4
Tom 18
Jerry 47
Cat 20
Doge 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}]
思路:题目中要运用到将字符串转化为字典,再将字典加入到列表,最后用列表的sorb函数进行排序,然后输出。
代码:
n=int(input())
d={}
ls= []
a = {}
for i in range (n):
a[i]=input().split() #这里运用到动态变量,可以用一个集合a来存储动态变量
d["name"] = a[i][0]
d["age"] = a[i][1]
ls.append(d.copy()) #看下面的说明,必须先开辟空间
def cmp1(a):
return a['age']
def cmp2(a):
return a['name']
ls.sort(key = cmp1)
print(ls)
ls.sort(key = cmp2)
print(ls)
说明
为什么要先开辟空间再加入:
在往列表中添加字典时若使用为键赋值的方式,则会出现前面的字典数据被最后一条字典数据覆盖。
list = []
a = {'a':'1', 'b':'1'}
list.append(a)
a['a'] = '2'
a['b'] = '2'
list.append(a)
[{‘a’: ‘2’, ‘b’: ‘2’}, {‘a’: ‘2’, ‘b’: ‘2’}]
列表的append方法在为其添加数据的时候并没有将完整的字典数据都拷贝的列表当中(为了提高空间的使用率),而是存储字典数据所在地址。
而以上这种方式修改的是该内存地址下的数据,这就导致了问题。
每次为列表添加数据的时候,在内存中其他位置创建与该字典相同的数据并加入列表(若字典内包含列表,需要使用deepcopy)
有关sorb函数,大家可以去看看这篇文章:
Python 列表 sort() 方法 (w3school.com.cn)https://www.w3school.com.cn/python/ref_list_sort.asp
看到这里啦,点个赞呗~