我想請求你的幫助。
任務: 對受試者所玩的“輪盤游戲”進行了 50 次觀察。鑒于贏和輸的資料已經知道(我有時間序列)并且他的總資本值在每場比賽后增加和減少我想計算總贏/輸的次數和長度平均連勝紀錄。(假設起始資本是 100,所以時間序列是 - series = [102,104,106,105,108,109,120,115,116,118,120,122,..].. 在這種情況下,第一次連續是 3。)
我對此非常陌生,并自己創造了這個謎語來挑戰我的邏輯思維,但在我看來,我完全迷失了,這也讓我感到沮喪。我想在這個練習中修改我對回圈和條件的了解,所以它不應該包含任何其他內容。
你能給我一個關于如何做到這一點的建議嗎?我試圖以這種方式思考,但最終對我來說真的沒有意義..
for i in range (0, len(series)-1):
while series[i] < series[i 1]: #While the following game brings profit
counter_win = counter_win 1 #The counter of good games should increase by 1
break
現在我找不到如何從下一個數字序列的開始重新開始的方法。
謝謝大家,因為我現在迷路了。
uj5u.com熱心網友回復:
我建議使用以下代碼:
current_streak = 0
streaks = []
for i in range (0, len(series)-1):
if series[i] < series[i 1]:
current_streak = 1
elif current_streak > 0:
streaks.append(current_streak)
current_streak = 0
# edge case if the game ends with a streak
if current_streak > 0:
streaks.append(current_streak)
print("{} Steaks with the average length {}".format(len(streaks), sum(streaks)/len(streaks)))
要計算損失的數量,您可以使用相同的方法
uj5u.com熱心網友回復:
您示例中的嵌套回圈將計算3. 作為連勝的3,那么一個連勝的2然后一個連勝的1。使用它來獲取連勝名單:
input_ = [100,102,104,106,105,108,109,120,115,116,118,120,122]
win_streak = 0
win_streaks = []
for i in range(1, len(input_)):
if input_[i] > input_[i-1]:
win_streak = 1
elif win_streak > 0:
win_streaks.append(win_streak)
win_streak = 0
if win_streak > 0:
win_streaks.append(win_streak)
average = sum(win_streaks) / len(win_streaks)
print(average)
uj5u.com熱心網友回復:
Hire 是一段代碼,展示了解決問題的可能方法。該代碼旨在具有指導意義,因此沒有進行優化,以便更容易理解:
data = [102,104,106,105,108,109,120,115,116,118,120,122]
# menages control between win and lose streak
boolean = False
# actualy counts the number of consecutive wins and loses
counter = 0
# Store the lenght of streak
win = []
lose = []
for i in range(1, len(data)):
if data[i] > data[i - 1]:
#If we were losing and we won one time add streak to array if needed and reset
#counter
if boolean is False:
if counter != 1:
lose.append(counter)
counter = 1
# Change boolean to address win streak
boolean = True
else:
counter = 1
if data[i] < data[i - 1]:
# Same as before but with opposite signs
if boolean is True:
if counter != 1:
win.append(counter)
counter = 1
boolean = False
else:
counter = 1
average_win=0
average_lose=0
for i in win:
average_win =i
for i in lose:
average_win =i
print(average_win/len(win))
print(average_lose/len(lose))
uj5u.com熱心網友回復:
這是一種方法。它并不漂亮,但它完成了作業。:)
如果有更多時間,我會將其拆分為單獨的功能等。
series = [102,104,106,105,108,109,120,115,116,118,120,122]
runs = {}
streak, last = 0, 0 # streak is key variable here as it goes negative for loss-streak
o = 1 # run-counter for our dictionary
for i in series:
if i > last and last: # first entry isn't a win right?
# Win
if streak < 0: # Winds have changed. Reset streak.
streak = 0
o = 1
if o in runs: runs[o] = "w"
else: runs[o] = "w"
streak = 1
elif i < last and last:
# Loss
if streak > 0: # Winds have changed. Reset streak.
streak = 0
o = 1
if o in runs: runs[o] = "l"
else: runs[o] = "l"
streak -= 1
last = i
high = sorted([ len(x) for x in runs.values() if "w" in x ],reverse=True)[0]
low = sorted([ len(x) for x in runs.values() if "l" in x ],reverse=True)[0]
print(f"Biggest win spree: {high}, loss spree: {low}")
average_wins = [ len(x) for x in runs.values() if "w" in x ]
print("Average winstreak:",round(sum(average_wins)/len(average_wins),1))
希望這是有幫助的。祝你有美好的一天!
編輯:你實際上并不需要 record_low&high 來考慮它。更新了一些愛好者。:)
uj5u.com熱心網友回復:
函式式編程解決方案:
from itertools import groupby
inp = [100,102,104,106,105,108,109,120,115,116,118,120,122]
streaks = [len(list(y)) for x,y in groupby(map(lambda x,y : x < y, inp, inp[1:])) if x == True]
print(streaks, sum(streaks)/len(streaks))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/371525.html
標籤:Python for循环 if 语句 while 循环
上一篇:如何在if陳述句下定義布林值
