iT邦幫忙

0

python題目請教,for loop的部分

  • 分享至 

  • xImage

不好意思,因為我不是本科的學生,所以不太會做,想了一整天完全沒頭緒,目前是在for loop跟nested loops的部分,前面只有教if跟list而已所以能用的不多,想請大家幫我看看這道題該麼解?
麻煩大家了!非常感謝~~

prices = [145.3, 143.5, 140.6, 137.8, 151.3, 155.4, 149.2, 152.5]
撰寫一個函數可以計算每個數值的三日移動平均值(moving average, MA),並將三日的中間數值與此移動平均值相減,並利用dict紀錄漲幅情形。

答案格式得像這樣
print(trend(prices[1], prices[:3]))
答: {'increase': 0.36666666666667425}

print(trend(prices[2], prices[1:4]))
答:{'decrease': -0.03333333333335986}

還有呈上題,扣除掉第一筆與最後一筆,利用for loop將上述moving average的每一個數值同時列印出來,答案得一模一樣,包含小數位、天數。

答案是像這樣:
Day2 is increase: 0.37.
Day3 is decrease: -0.03.
Day4 is decrease: -5.43.
Day5 is increase: 3.13.
Day6 is increase: 3.43.
Day7 is decrease: -3.17.

以上兩題,麻煩各位大神幫我解答一下!!

看更多先前的討論...收起先前的討論...
tryit iT邦研究生 4 級 ‧ 2022-10-14 23:48:15 檢舉
我會希望看到你完整的程式碼耶,理論上來說就算你加那東西也是不會出錯的,你應該有地方寫錯了
tryit iT邦研究生 4 級 ‧ 2022-10-15 01:10:20 檢舉
我個人執行沒有發生任何錯誤耶@@
我看你的程式碼也沒有什麼特別問題,除了那個all
all是python的內置函式的名稱,盡量不要用它命名
tryit iT邦研究生 4 級 ‧ 2022-10-15 01:11:41 檢舉
另外計算prices的平均我會這樣寫
list_average = sum(prices)/len(prices)
這樣就好,sum會自動計算總合
tryit iT邦研究生 4 級 ‧ 2022-10-15 03:48:00 檢舉
阿,我又看到一個邏輯比較神奇的地方,不過依然與你說的錯誤無關,就是你最後一行的print(),為什麼一直不放過前三天呢OAO?
我是用google colab執行的,不知道為什麼就會出錯@@
然後最後一行的print我是想說像我上面答案的格式那樣一條一條列,只是為了方便就只先列前三天
tryit iT邦研究生 4 級 ‧ 2022-10-15 18:44:28 檢舉
總之,你那程式沒有錯誤
恩,我再自己研究一下,謝謝你
tryit iT邦研究生 4 級 ‧ 2022-10-16 20:21:17 檢舉
如果可以的話給個最佳解答感謝你
給了,感謝你
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
tryit
iT邦研究生 4 級 ‧ 2022-10-14 01:32:04
最佳解答

不懂,只有學list的話,為啥題目會有dict的東西@@
基本上需要以下概念

  1. def && return
  2. iterate
  3. dict method
  4. string format
def trend(mid:int,threeNum:list)->dict:#單純提示你輸入進來東西的資料型態與return的資料型態
    average = sum(threeNum)/3 #三日平均
    result = mid - average #得到結果
    if result > 0: #確認key應該是啥
        key = "increase"
    elif result < 0:
        key = "decrease"
    #你題目沒說相等時如何處置
    return {key:result}#回傳字典
prices = [145.3, 143.5, 140.6, 137.8, 151.3, 155.4, 149.2, 152.5]
temp = []#儲存用
for i in range(1,len(prices)-1):
    result = trend(prices[i], prices[i-1:i+2])
    print(result)
    temp.append(result)    
###################################
#理論上你得到這些數值之後應該會存到一個空間
#那就只要進行輸出即可
day = 2#計算日子用
for i in temp:
    key,value = list(i.items())[0]#dict.keys(),dict.values(),dict.items()為dict必會知識
    print(f"Day{day} is {key}:{value:.2f}.") #運用python裡的format->format不懂可以google
    day +=1

以上這樣

想問一下,它前面還有一題是要算平均,我自己寫出來是長這樣

#計算list的平均值
all = 0
for i in prices[0:7]:
  all = all + i
list_average = (all + i)/8

print(list_average)

但把這個放在前面後,你寫的 average = sum(threeNum)/3 這條就會報錯說'float' object is not callable,想問問該如何解決@@

完整的話長這樣

prices = [145.3, 143.5, 140.6, 137.8, 151.3, 155.4, 149.2, 152.5]

#計算list的平均值
all = 0
for i in prices[0:7]:
  all = all + i
list_average = (all + i)/8

print(list_average)

#三日移動平均值
def trend(mid:int,threeNum:list)->dict:
    three_avg = sum(threeNum)/3 
    result = mid - three_avg
    if result > 0: 
        out ="increase"
    elif result < 0:
        out="decrease"
    return {out:result}
out_data = []
for i in range(1,len(prices)-1):
    result = trend(prices[i], prices[i-1:i+2])
    out_data.append(result)    
    print(trend(prices[1], prices[:3]))
tryit iT邦研究生 4 級 ‧ 2022-10-15 01:07:48 檢舉

https://ithelp.ithome.com.tw/upload/images/20221015/201086495nSTvWhAxo.jpg
我看沒有產生任何錯誤耶

我要發表回答

立即登入回答