簡體   English   中英

Python 帶枚舉的 For 循環:“字符串索引超出范圍”

[英]Python For Loop with Enumerate: 'String Index Out Of Range'

我一直在嘗試在 Python 中編寫一個 for 循環,其目標是遍歷按字母順序排序的字母列表和相應的數字列表,並執行累積計算:

  1. 如果第一個列表中的字母與前一個字母不同(即,這是該字母第一次出現在列表中),則將第二個列表中的相應數字除以 0.5,然后 append 將其放入新列表中。
  2. 直到第一個列表中的字母發生變化,從新列表中取出以前的值,乘以0.5,然后將數字列表中的當前項和append結果添加到新列表中。

此示例顯示這將如何在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM