[英]Python For Loop with Enumerate: 'String Index Out Of Range'
我一直在嘗試在 Python 中編寫一個 for 循環,其目標是遍歷按字母順序排序的字母列表和相應的數字列表,並執行累積計算:
此示例顯示這將如何在 Excel 中工作: MS Excel 計算
起初,我認為我可以做一些類似於此處概述的事情,使用 while 循環並讓它引用以前的值,但后來這似乎無法用於此目的,因為已經存在一個列表(字母) 我需要引用以前的值(而不是僅僅在新列表中引用以前的值)。
然后我嘗試將 for 循環與枚舉一起使用,但出現“字符串索引超出范圍”錯誤:
import numpy as np
import pandas as pd
d={'Letters':['A','A','A','B','B','B'],'Numbers':[1,2,3,4,5,6]}
df=pd.DataFrame(data=d)
Number=df.Numbers
Letter=df.Letters
NumberOutput=[]
for index,(x,y) in enumerate(zip(Number,Letter)):
if index==0:
NumberOutput.append(x/0.5)
elif index>0 and y!=y[index-1]:
NumberOutput.append(x/0.5)
else:
NumberOutput.append((NumberOutput[index-1]*0.5)+x)
我假設這里的問題是 for 循環試圖引用列表中 position 0 處的前一個 Letter 值,即前一個字符串索引不存在,但循環明確處理了 index==0 之前的情況試圖引用 index-1,所以我不清楚為什么會導致此錯誤。
我最終走上了一條不同的路線,並使用了兩個單獨的 for 循環,一個創建了一個“LetterFlags”列表(只要第一個列表中的字母發生變化就標記 1,否則標記 0),然后第二個使用'LetterFlag' 判斷當前的 Letter 是否與前一個不同。 這種方法不會拋出錯誤並產生正確的結果,但這似乎不是最有效的方法:
import numpy as np
import pandas as pd
d={'Letters':['A','A','A','B','B','B'],'Numbers':[1,2,3,4,5,6]}
df=pd.DataFrame(data=d)
LetterFlag=[]
Number=df.Numbers
Letter=df.Letters
for (previousL,currentL) in zip(Letter,Letter[1:]):
if previousL!=currentL:
LetterFlag.append(1)
else:
LetterFlag.append(0)
LetterFlag=[1]+LetterFlag
df['LetterFlag']=LetterFlag
LetterFlag=df.LetterFlag
NumberOutput=[]
for index,(x,y) in enumerate(zip(LetterFlag,Number)):
if x==1:
NumberOutput.append(y/0.5)
else:
NumberOutput.append((NumberOutput[index-1]*0.5)+y)
有沒有更好的方法可以做到這一點? 預先感謝您提供任何指導。
如果我正確理解了這個問題,你可以這樣做:-
letters = ['A', 'A', 'A', 'B', 'B', 'B']
numbers = [1, 2, 3, 4, 5, 6]
assert len(letters) == len(numbers)
numout = [numbers[0]*0.5]
for i, L in enumerate(letters[1:], 1):
if L != letters[i-1]:
numout.append(numbers[i]*0.5)
print(*numout)
使用這些值,output 將是:- 0.5 2.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.