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

时间:2012-10-08 05:12:39

标签: python

我有这样的事情:

#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个元素,我从0到6,并且在处理过程中如果我删除了一个数组元素,那么新的大小变为6但是循环仍然会运行直到i = 6并且访问令牌[6]并抛出错误,因为新的大小是6,即最大索引是5。

我想我可以使用带有某些条件的while循环:

while(i<currMaxIndex)

我可以动态更改currMaxIndex。

但我真的很想知道在for循环中是否有任何改变我的方法。

如果绝对必须知道,这是我的代码:

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

2 个答案:

答案 0 :(得分:4)

我会这样做:

def myfilter(token):
    return token.translate(None, string.punctuation)   

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

如果逻辑太复杂而无法通过地图/过滤器进行,建议使用此方法:

for item in items[:]: # [:] copies the list
    if condition(item):
        items.remove(item)

答案 1 :(得分:2)

创建len(tokens)对象时会计算

xrange,因此如果要从列表中删除元素,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)

或者您可以filter生成器表达式:

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