2017-04-09 54 views
1

我試圖在元素中存在'>'時將'a'插入到filesContent列表中。以下代碼成功插入'a'元素後「>」除了最後2「>」元素。我不明白爲什麼。如果元素中包含'>',則在列表中插入一個字符

def specialparseFile(fname): 
    filesContent = list() 
    with open(fname) as f: 
     lines = [i.strip() for i in f] 
     lines = [line for line in lines if line] 
     for i in lines: 
      filesContent.append(i) 

     for x in range(len(filesContent)): 

      if '>' in filesContent[x]: 
       filesContent.insert(x + 1, 'a') 
    print(filesContent) 
    return filesContent 
+4

因爲'filesContent'的長度在添加到它時會發生變化。嘗試向後循環,'range(len(filesContent) - 1,-1,-1)' –

+0

謝謝!循環向後解決它! –

+0

你能舉一個例子給你輸入和你想要的輸出嗎? – Cleb

回答

2

比方說你filesContentl

l = ['>', 'b', '>'] 

它的長度爲3,讓你的for循環遍歷指數0,1和2。指數0後的數組將是:

l = ['>', 'a', 'b', '>'] 

現在你可以看到你的問題,最後>會永遠無法實現,因爲它是在指數3

可以循環向後而不是解決此問題:

range(len(filesContent) - 1, -1, -1) 

或者如果你喜歡:

reversed(range(len(filesContent))) 

現在通過2循環,1,0,在第一次迭代後,你將有:

l = ['>', 'b', '>', 'a'] 

隨着未來指數爲1,很明顯,以前除了不會影響列表中仍然必須循環。

+0

我很欣賞擴展您的評論的解釋! –

+1

這些種類的範圍讓我感到困惑,我更喜歡更清晰的'反向(範圍(...))' – Copperfield

0

你也可以做到無論是在同一迴路

... 
for item in lines: 
    filesContent.append(item) 
    if ">" in item: 
     filesContent.append("a") 
2

你的錯誤的根本原因已經@Nick A的回答很好解釋的,另一種方法是刪除for循環,並在所有忘記名單的指數,通過使用下面的代碼:

def specialparseFile(fname): 
    with open(fname) as f: 
     lines = filter(None, map(lambda x: x.strip(), f)) 
     result = [[l, 'a'] if '<' in l else [l] for l in lines] 
     return sum(result, []) # flatten the nested list generated by previous line of code 
相關問題