# 人名後若無推薦則無空格,推薦物品最後一個無空格
threshold = int(input())/100 # 推薦閾值
customerDict = {} # {人:{a買過的東西}}
productLst = [] # 照順序存出現過商品
# while loop for 輸入 人 & 買的東西,並存到 customerDict 及 productSet
while True:
nameAndProduct = input().split() # INPUT = 人 東西 東西
if nameAndProduct[0] == "end": # 輸入 end 停止迴圈
break
for i in nameAndProduct:
if i == nameAndProduct[0]: # 名字為 key,value 為空 set
customerDict[nameAndProduct[0]] = set()
else: # 將所買物品加到 set 中
customerDict[nameAndProduct[0]].add(i)
# 將商品照出現順序存到 list 中
if i not in productLst:
productLst.append(i)
# 比對相似度並給予推薦商品
for mine in customerDict:
recommandSet = set() # 存推薦商品
for other in customerDict: # 利用巢狀迴圈同時讀取不同人買的物品
if mine == other: # 兩個迴圈都是自己的話就跳過
pass
else: # 比較相似度、若超過閾值則把推薦商品新增到 recommandSet 中
myProductNum = len(customerDict[mine])
same = len(customerDict[other] & customerDict[mine])
if same == 0: # 避開 ZeroDivisionError
pass
elif (same / myProductNum) >= threshold:
for item in (customerDict[other] - customerDict[mine]):
recommandSet.add(item)
print(mine, end="") # 輸出人名,若後續無推薦名單則無需空格,故 end=""
tempLst = [""] # 存推薦名單用,內建一個空的元素 for 在人名和推薦物品間產生空格用
for i in productLst: # 讓推薦物品照出現順序新增至 tempLst
if i in recommandSet:
tempLst.append(i)
if tempLst != [""]: # 輸出推薦物品,物品間及和人名間產生空格
print(" ".join(tempLst), end="")
print() # 換行用
錯誤訊息
問題描述
測資都 ok 但仍 WA,看他人提問覺得可能是人名跟物品後空格的問題,但試過不同組合仍 WA,下面列出其他種組合跟上面不一樣得程式碼。再麻煩助教了~謝謝!
# 人名後若無推薦則無空格,推薦物品最後一個有空格
print(mine, end="") # 輸出人名,若後續無推薦名單則無需空格,故 end=""
tempLst = [""] # 存推薦名單用,內建一個空的元素 for 在人名和推薦物品間產生空格用
for i in productLst: # 讓推薦物品照出現順序新增至 tempLst
if i in recommandSet:
tempLst.append(i)
if tempLst != [""]: # 輸出推薦物品,物品間及和人名間產生空格
print(" ".join(tempLst), end=" ")
print() # 換行用
# 人名後一定有空格,推薦物最後也有空格
print(mine, end=" ") # 輸出人名,人名後有空格
for i in productLst: # 讓推薦物品照出現順序新增至 tempLst
if i in recommandSet:
print(i, end=" ") # 物品後有空格
print() # 換行用
提交連結
https://judge.ccclub.io/status/dc72afb0d60fd2fc0fc19310378461bf
程式碼
錯誤訊息
問題描述
測資都 ok 但仍 WA,看他人提問覺得可能是人名跟物品後空格的問題,但試過不同組合仍 WA,下面列出其他種組合跟上面不一樣得程式碼。再麻煩助教了~謝謝!