今天开始改变写博客风格,其他不多说.
今天题目如下:
# 7、写函数,完成以下功能: (8分)
# 例如有:
# user_list=[
# {"name": "alex","hobby":"抽烟"},
# {"name" :"alex","hobby":"喝酒"},
# {"name" :"alex","hobby":"烫头"},
# {"name":"wusir","hobby":"喊麦"},
# {"name":"wusir","hobby":"街舞"},
# ]
# 编写函数处理user_list 并返回如下结果:
# [{"name":"alex","hobby_list": ["抽烟","喝酒","烫头"]},
# {"name":"wuhir","hobby_list": ["喊麦","街舞"]},]
我先写自己的写程序的方法,先直接看正确完整的代码直接往下看
一开始看了题目,我发现的规律是"alex"、"name"、"hobby"由多个变成一个
因此我想到了用set集合去重
我是想要把user_list列表的键收集起来变成列表,然后通过set集合去重
但是走到下面代码的时候发现无法再下手写代码,我想知道我这样的思路错在哪里了
dict={}
list=[]
for a in user_list:
# print(a)
for k,v in a.items():
# print(k,v)
dict.setdefault(k,[]).append(v)
for b,c in dict.items():
print(b,c)
print(dict)
上面的难题卡了我两三个小时,卡在我一直把'name'和'hobby'设置成一个变量,导致感觉变量太多,无法下手(小声逼逼:不知道是不是这个原因)
如果不是我说的原因,我想知道问题出在哪里
所以我想了很久想不出来,然后去百度找,找到下面的代码,但是我也没有看懂
result = [] # {'name': 'alex', 'hobby_list': ['抽烟']}
for user in user_list:
# 1.对空列表进行for循环,判断是否在result里面存在了这个人, 如果存在. 把hobby_list添加一个hobby
# 2.不存在. 创建一个新字典
for new_user in result:
if user['name'] == new_user['name']:
new_user['hobby_list'].append(user['hobby'])
break
else:
dic = {}
dic["name"] = user['name']
dic['hobby_list'] = [user['hobby']]
result.append(dic)
print(result)
但我看了好几遍上面的代码和再审题好几遍,我想到一个解决思路
思路如下:
我通过结果发现结果里有列表、字典,还有就是name和hobby相对来说可以是组成一个键值对
名字和爱好可以组成另一个键值对,所以我想到了把名字爱好放到一个字典中,最后来再变成值
具体代码如下:
def main(user_list):
#有结果可知,我们需要字典和列表,所以先设dict和list
dict={}
list=[]
for i in user_list:#这里通过for循环先把原列表中的字典提出来
dict.setdefault(i['name'],[]).append(i['hobby'])#这里通过字典的setdefault的性质来把名字去重
for k,v in dict.items():#这里通过for循环把上一步字典里的名字和爱好分开变成值
list.append({'name':k,'hobby_list':v})#这里把名字和爱好变成的键变成字典里'name'和'hobby_list'的值
return list
print(main(
[
{"name": "alex","hobby":"抽烟"},
{"name" :"alex","hobby":"喝酒"},
{"name" :"alex","hobby":"烫头"},
{"name":"wusir","hobby":"喊麦"},
{"name":"wusir","hobby":"街舞"},
]
))
总结:写代码要看清要求是什么,不一定要顺着推,可以逆着推,有结果推出来,这样也或许可以解决问题