2016-12-21 38 views
1

我有一個包含其他列表和字典值的元素的大型列表。的基本結構是:元素刪除後的內部循環行爲

for i in outer: 
    for j in range(len(inner)-1,-1,-1): 
     if j: 
      del outer[i] 

所以數據的在嵌套結構中存在指示我們是否保留在外部列表整個元件。刪除元素會在外部列表中立即轉移。

我是否需要明確繼續控制邏輯或者這是否暗示發生了嗎?

for i in outer: 
    for j in range(len(inner)-1,-1,-1): 
     if j: 
      del outer[i] 
      continue 

我目前使用這似乎給了我想要的結果,同時運行測試前設置。我想我只是試圖確定內部循環是否會在調用del之後不必要地運行,或者Python足夠聰明以知道先前的第i個元素已被刪除,並且不再需要繼續遍歷其內部。

+2

你爲什麼不直接'打印(i)'並自己測試一下? – pbreach

+0

'del outer [i]'不會做你認爲它做的事。 '我'是元素,而不是它的索引。 – Barmar

+0

你的意思是像'爲我,內在枚舉(外):'? – Barmar

回答

1

不,Python並不「足夠聰明」去做你正在設想的事情。如果您不希望內部循環在刪除後繼續,則肯定需要一些硬編碼的continue s/break

一般情況下,你不應該刪除您遍歷容器的元素。我不清楚你在你的示例代碼中究竟做了什麼,但是允許(儘管仍然皺眉)的一個例子是在列表中向後循環(是你正在嘗試的嗎?)並刪除當前或後來的元素。

順便說一句,你確定要刪除i「日的outer元素,當i不是指數,但實際i」 th元素本身?

+0

感謝你的這一點,我認爲這是必要的。我儘量避免在可能的地方使用continue/break,並且通常在這種情況下可能會有更好的方式來更深入地實現這個邏輯。 關於不刪除我正在循環的容器的元素;這也是我所知道的。切實做出複製並從中刪除元素將是更好的方式。我再也找不到確切的參考資料,但這段代碼部分解決了另一個問題,但沒有說明這個問題。 –