coding-coworking-club / python-spring-2021

ccClub Python Spring 2021
https://www.ccclub.io/course/2021Spring
23 stars 6 forks source link

[Homework 4] 推薦系統 #508

Closed chianshianli closed 3 years ago

chianshianli commented 3 years ago

提交連結

https://judge.ccclub.io/status/dc72afb0d60fd2fc0fc19310378461bf

程式碼

# 人名後若無推薦則無空格,推薦物品最後一個無空格
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()  # 換行用

錯誤訊息

image

問題描述

測資都 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()  # 換行用
TJ72 commented 3 years ago

問題同 #506 ,最後輸出的推薦商品順序是根據其他顧客購買商品的順序而不是商品輸入時的順序喔

chianshianli commented 3 years ago

後來 AC 了~謝謝助教提點!