我有这样的事情:
#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]
答案 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))