2012-10-08 24 views
4

我有這樣的事情:如何在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個元素,i從0變爲6,以及在處理的中途,如果我刪除陣列元素,那麼新的大小變爲6但循環仍然會運行,直到我= 6和訪問令牌[6]並拋出一個錯誤,因爲新的大小是6,即最大索引是5.

我想我可以使用一個while循環,如:

while(i<currMaxIndex) 

其中我可以動態改變currM axIndex。

但我真的很好奇,知道是否有任何方法來改變我在for循環本身。

如果絕對必須知道,這是我的代碼:

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

回答

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) 
+0

這有點搖頭計算嗎?用[:]複製整個列表? –

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)) 
相關問題