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

题目:第一行输入一个正整数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)icon-default.png?t=M276https://www.w3school.com.cn/python/ref_list_sort.asp

看到这里啦,点个赞呗~

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值