所以我正要解決這個練習:假設1是和 的朋友2,并且2是 的朋友3。如果3不是好友1,會被推薦為好友。創建按用戶識別符號分組的建議字典,并將其分配給變數建議。字典的結構應該如下: 鍵應該是用戶識別符號。該值應該是被建議為朋友的用戶識別符號串列,如果不存在建議,則為空串列。
我已經用以下輸出編碼了朋友字典:
{1: [11, 17, 18], 2: [3, 8], 3: [2, 4, 8], 4: [3, 14], 5: [7, 10], 6: [], 7: [5, 9, 16], 8: [2, 3, 10], 9: [7], 10: [5, 8, 13, 15, 19], 11: [1, 17, 18], 12: [], 13: [10, 14, 15, 16, 19], 14: [4, 13], 15: [10, 13], 16: [7, 13, 18], 17: [1, 11, 20], 18: [1, 11, 16], 19: [10, 13], 20: [17]}
然后我試圖為回圈找到正確的組合:
suggestions = {}
for user1 in friends:
suggestions[user1] = []
for user2 in friends:
for user3 in friends:
if user1 in friends[user2] and user2 in friends[user3] and user3 not in friends[user1]:
suggestions[user1].append(user3)
print(suggestions)
不幸的是,我的輸出是:
{1: [1, 1, 20, 1, 16], 2: [2, 4, 2, 10], 3: [3, 3, 14, 3, 10], 4: [2, 4, 8, 4, 13], 5: [5, 9, 16, 5, 8, 13, 15, 19], 6: [], 7: [7, 10, 7, 7, 13, 18], 8: [8, 4, 8, 5, 8, 13, 15, 19], 9: [5, 9, 16], 10: [7, 10, 2, 3, 10, 10, 14, 16, 10, 10], 11: [11, 11, 20, 11, 16], 12: [], 13: [5, 8, 13, 4, 13, 13, 7, 13, 18, 13], 14: [3, 14, 10, 14, 15, 16, 19], 15: [5, 8, 15, 19, 14, 15, 16, 19], 16: [5, 9, 16, 10, 14, 15, 16, 19, 1, 11, 16], 17: [17, 18, 17, 18, 17], 18: [17, 18, 17, 18, 7, 13, 18], 19: [5, 8, 15, 19, 14, 15, 16, 19], 20: [1, 11, 20]}
In [19]:
所以對于第 1 個人:第 1 個人收到與自己成為朋友的建議???我不知道我做錯了什么 - 有人可以幫我解決這個問題并額外解釋為什么他的做法與我的做法不同嗎?
感謝您的幫助!
最好的
uj5u.com熱心網友回復:
串列迭代在這里很有幫助,就像使用集合一樣,它很容易消除重復。
它仍然是一個三重回圈,對于朋友串列中的每個人,我們收集不是該人或已經不是該人朋友的朋友的所有索引。
suggestions = dict()
for k, v in friends.items():
suggestions[k] = list(set(f for vf in v for f in friends[vf] if f != k and f not in v))
主回圈為 中的每個人生成一個結果friends。k是人,v是朋友串列。vf in v遍歷每個人的朋友,回傳vf他們的朋友串列。f in friends[vf]然后獲取朋友的所有朋友,只要他們不是該人或該人的現有朋友。將該結果放入呼叫以set簡單地創建一個沒有重復的集合,然后我們將其轉換為串列并將其插入字典。
或者,在一行中。
suggestions = dict((k, list(set(f for vf in v for f in friends[vf] if f !=k and f not in v))) for k,v in friends.items())
我們還可以使用設定差異來洗掉此人及其現有朋友。
uj5u.com熱心網友回復:
這是我的解決方案,我認為它非常易讀,但簡而言之:1)迭代user和friends,friends_dict2)為每個朋友添加(而不是附加)它的朋友,suggestions_dict[user]如果 A)朋友不是用戶,B)如果朋友尚未列出。
注意與串列推導結合使用的 = 代替 。這大大簡化了回圈。.append()
friends_dict = {1: [11, 17, 18], 2: [3, 8], 3: [2, 4, 8], 4: [3, 14], 5: [7, 10], 6: [], 7: [5, 9, 16], 8: [2, 3, 10], 9: [7], 10: [5, 8, 13, 15, 19], 11: [1, 17, 18], 12: [], 13: [10, 14, 15, 16, 19], 14: [4, 13], 15: [10, 13], 16: [7, 13, 18], 17: [1, 11, 20], 18: [1, 11, 16], 19: [10, 13], 20: [17]}
suggestions = {k:[] for k in friends_dict}
for user, friends in friends_dict.items():
for friend in friends:
suggestions[user] = [u for u in friends_dict[friend] if (u != user and u not in friends)]
結果是:
{1: [20, 16],
2: [4, 10],
3: [14, 10],
4: [2, 8, 13],
5: [9, 16, 8, 13, 15, 19],
6: [],
7: [10, 13, 18],
8: [4, 5, 13, 15, 19],
9: [5, 16],
10: [7, 2, 3, 14, 16],
11: [20, 16],
12: [],
13: [5, 8, 4, 7, 18],
14: [3, 10, 15, 16, 19],
15: [5, 8, 19, 14, 16, 19],
16: [5, 9, 10, 14, 15, 19, 1, 11],
17: [18, 18],
18: [17, 17, 7, 13],
19: [5, 8, 15, 14, 15, 16],
20: [1, 11]}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516930.html
標籤:Python循环字典
上一篇:觸發在另一個表中搜索插入的值
下一篇:呼叫中斷方法
