欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

十二.作业难点(有IT大牛路过的可以帮我解答我的疑问?万分感谢)--转行的苦逼人

程序员文章站 2022-05-03 22:42:38
今天开始改变写博客风格,其他不多说. 今天题目如下: 我先写自己的写程序的方法,先直接看正确完整的代码直接往下看 一开始看了题目,我发现的规律是"alex"、"name"、"hobby"由多个变成一个 因此我想到了用set集合去重 我是想要把user_list列表的键收集起来变成列表,然后通过set ......

今天开始改变写博客风格,其他不多说.

今天题目如下:

# 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":"街舞"},
]
))

总结:写代码要看清要求是什么,不一定要顺着推,可以逆着推,有结果推出来,这样也或许可以解决问题