如何在Python中更改循环中迭代变量的值?

4

我有以下类似内容:

#tokens is a list of a few words
for i in xrange(0,len(tokens)):
    #some code to modify the contents of token[i]
    if tokens[i] == some value:
        del tokens[i]

现在如果数组有7个元素,i的取值范围是0到6,在处理过程中如果我删除了一个数组元素,则新的大小变为6,但循环仍将运行到i=6并访问tokens[6],这将引发错误,因为新的大小是6,即最大索引为5。
我想我可以使用while循环,并加上一些条件,例如:
while(i<currMaxIndex)

我希望能够动态更改currMaxIndex。

但是我很好奇是否有一种方法可以在for循环本身中修改i。

如果您一定需要知道,这是我的代码:

for i in xrange(0,len(tokens)):
            tokens[i]=tokens[i].translate(string.maketrans("",""),string.punctuation)
            if tokens[i]=='':
                del tokens[i]
2个回答

4
我会这样做:
def myfilter(token):
    return token.translate(None, string.punctuation)   

tokens = filter(None, map(myfilter, tokens))

如果逻辑太复杂,无法通过map / filter完成,建议使用以下方法:
for item in items[:]: # [:] copies the list
    if condition(item):
        items.remove(item)

这在计算上有点重吧?使用[:]复制整个列表? - Programming Noob

2
在创建xrange对象时,len(tokens)被计算出来,因此如果您从列表中删除元素,则tokens[i]可能不存在,或者其值可能与您预期的不同。例如:
>>> a = [1, 2, 3]
>>> a[1]
2
>>> del a[1]
>>> a[1]
3

不要修改原始列表,创建一个新的列表:

new_tokens = []

for token in tokens:
    translated = token.translate(None, string.punctuation)

    if translated:
        new_tokens.append(translated)

或者你可以过滤一个生成器表达式:

new_tokens = filter(None, (token.translate(None, string.punctuation) for token in tokens))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接