繁体   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