今天開始改變寫博客風格,其他不多說. 今天題目如下: 我先寫自己的寫程式的方法,先直接看正確完整的代碼直接往下看 一開始看了題目,我發現的規律是"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":"街舞"},
]
))
總結:寫代碼要看清要求是什麼,不一定要順著推,可以逆著推,有結果推出來,這樣也或許可以解決問題