coding-coworking-club / basic-python-fall-2021

11 stars 6 forks source link

[Homework 4] 小仔整理交易清單 #360

Closed garykhtw closed 2 years ago

garykhtw commented 2 years ago

提交連結

https://judge.ccclub.io/contest/83/problem/02

程式碼



commodity_num, record_num = [int(i) for i in input().split()]

price_dict = dict()
for i in range (commodity_num):
    commodity = input().split()
    price_dict [commodity[0]] = int(commodity [1]) #{商品:價格}

record_dict = {} #將交易紀錄轉成{姓名:{購買商品:購買數量}
name_list = []
for i in range (record_num): #有幾筆交易,輸入幾次
    record = input().split()
    name_list.append (record[0]) #建立人名清單,以利後續可以查詢有誰購買
    name = set( name_list )
    if record[0] in record_dict:
        dict_1 = record_dict[record[0]]
        dict_2 = {record[1]:int(record[2])}
        dict_1.update(dict_2)
        del record_dict[record[0]]
        record_dict [record[0]] = dict_1
    else: #如果record_dict沒有資料,檔案建檔
        record_dict [record[0]] = {record[1]: int(record[2])}

while True:
    try: #不定值輸入,直到error跳出程式
        check = input().split() #輸入資料
        if check != []:
            if check [0] == "A": #如果第一碼為A,則跑以下程式,[編號,姓名]
                shopping_list = record_dict [check[1]] #check[1]為人名,帶入消費紀錄的字典中,查出消費紀錄{購買商品:購買數量}
                shopping_list_keys = shopping_list.keys() #以keys()查出消費紀錄中的購買商品
                total_price = 0
                for i in shopping_list_keys:
                    total_price += price_dict[i] * shopping_list[i] #購買商品帶入價格字典,查出商品售價,再乘於消費紀錄中的數量
                print(total_price)

            elif check[0] == "B": #如果第一碼為B,則跑以下程式,[編號,姓名,商品]
                if check[1] in record_dict:
                    if check [2] in record_dict[check[1]]: #以姓名查詢消費紀錄,如果商品不再消費紀錄中,輸出0
                        print(record_dict[check[1]][check[2]])
                    else:
                        print (0) # 如果有消費該商品,使用姓名查詢消費紀錄,並使用商品進一部查詢購買數量。
                else:
                    print(0)

            elif check[0] == "C": #如果第一碼為C,則跑以下程式,[編號,商品]
                ans = [] 
                for i in name: #使用姓名調出每個人的消費紀錄
                    if check[1] in record_dict[i]: #如果每個人的消費紀錄中,有消費該商品,則放入ans。
                        ans.append(i)
                else:
                    continue #該人員沒有消費該商品,則跳過

                if ans == []: #如果該商品都沒人消費,則輸出0 
                    print(0)
                else:
                    ans = sorted(ans) #姓名以字母從小到大排序 
                    ans = (",".join(ans)) #姓名間以逗號連接輸出
                    print(ans)
        else:
            break
    except:
        breakcommodity_num, record_num = [int(i) for i in input().split()]

price_dict = dict()
for i in range (commodity_num):
    commodity = input().split()
    price_dict [commodity[0]] = int(commodity [1]) #{商品:價格}

record_dict = {} #將交易紀錄轉成{姓名:{購買商品:購買數量}
name_list = []
for i in range (record_num): #有幾筆交易,輸入幾次
    record = input().split()
    name_list.append (record[0]) #建立人名清單,以利後續可以查詢有誰購買
    name = set( name_list )
    if record[0] in record_dict:
        dict_1 = record_dict[record[0]]
        dict_2 = {record[1]:int(record[2])}
        dict_1.update(dict_2)
        del record_dict[record[0]]
        record_dict [record[0]] = dict_1
    else: #如果record_dict沒有資料,檔案建檔
        record_dict [record[0]] = {record[1]: int(record[2])}

while True:
    try: #不定值輸入,直到error跳出程式
        check = input().split() #輸入資料
        if check != []:
            if check [0] == "A": #如果第一碼為A,則跑以下程式,[編號,姓名]
                shopping_list = record_dict [check[1]] #check[1]為人名,帶入消費紀錄的字典中,查出消費紀錄{購買商品:購買數量}
                shopping_list_keys = shopping_list.keys() #以keys()查出消費紀錄中的購買商品
                total_price = 0
                for i in shopping_list_keys:
                    total_price += price_dict[i] * shopping_list[i] #購買商品帶入價格字典,查出商品售價,再乘於消費紀錄中的數量
                print(total_price)

            elif check[0] == "B": #如果第一碼為B,則跑以下程式,[編號,姓名,商品]
                if check[1] in record_dict:
                    if check [2] in record_dict[check[1]]: #以姓名查詢消費紀錄,如果商品不再消費紀錄中,輸出0
                        print(record_dict[check[1]][check[2]])
                    else:
                        print (0) # 如果有消費該商品,使用姓名查詢消費紀錄,並使用商品進一部查詢購買數量。
                else:
                    print(0)

            elif check[0] == "C": #如果第一碼為C,則跑以下程式,[編號,商品]
                ans = [] 
                for i in name: #使用姓名調出每個人的消費紀錄
                    if check[1] in record_dict[i]: #如果每個人的消費紀錄中,有消費該商品,則放入ans。
                        ans.append(i)
                else:
                    continue #該人員沒有消費該商品,則跳過

                if ans == []: #如果該商品都沒人消費,則輸出0 
                    print(0)
                else:
                    ans = sorted(ans) #姓名以字母從小到大排序 
                    ans = (",".join(ans)) #姓名間以逗號連接輸出
                    print(ans)
        else:
            break
    except:
        break

## 錯誤訊息

<!-- 若有錯誤訊息請提供截圖,若無則請留空。 -->

Wrong answer

## 問題描述

<!-- 請盡量完整地敘述你的問題。 -->

助教你好,
 題目的解題邏輯是建立消費紀錄字典,{ 人員姓名:   { 購買商品 : 購買數量 } }。目前可以解決測資的問題。A/B/C三種方式也可以用這方式解出,但題目還是WA,請問我是不是有哪個地方沒有考慮到?
LinYuanSheng commented 2 years ago

你的程式碼好像沒有貼好,很多if和for迴圈下面沒有空四格,麻煩你整理好再貼上來~

garykhtw commented 2 years ago

助教你好, 重新法程式碼貼上了,順便附上colab連結。 https://colab.research.google.com/drive/1sbmteb1WeGK9G01gwOQH3YDMhc4h3Ky7?usp=sharing

LinYuanSheng commented 2 years ago

好像還是沒有空四格?不過我先幫你看了一下,指令B的部分,要顧客有在字典中,以及顧客有購買該商品,才會印出商品數量,你應該少了檢查顧客在字典的情況~

garykhtw commented 2 years ago

助教你好,

  1. 後來我用jupyter調整空格,結果如上,看起來正常了。我習慣用colab寫程式,但有時候複製後,空隔間距會不同。想跟你請問,這有可能是什麼造成的啊? 我記得colab也是以jupyter為模板啊?
  2. B新增檢查是否有人名,發現還是WA問題。
  3. 我細看三個指令,目前都有符合,還是想不出問題QQ。 指令A,輸出一整數,為指定顧客的消費總金額 指令B,如果沒買過輸出 0,有買過輸出購買總個數 指令C,輸出購買指定商品的所有顧客編號,中間以逗號隔開,如沒人購買則輸出 0
LinYuanSheng commented 2 years ago
  1. 這個我不擅長我可以幫你問問更厲害的助教~ 》你是不是用了tab,每個程式預設的tab空格可能不一樣,用空白鍵比較保險
  2. 你修改的程式碼我貼到Judge變成RE欸,要不要找找看程式有沒有容易出錯的地方(Judge的RE比jupyter或其他軟體敏感多了)
  3. 你先修改看看能不能回到至少WA,我整理幾個指令常見沒有想到的地方,你先檢查看看有沒有想到
garykhtw commented 2 years ago

感謝助教,我用上面幾點慢慢確認,judge接受了。 指令A要多寫一個,如果沒有消費要輸出0元(print(0)),我之前是讓他跳過沒有輸出。