2015-06-09 56 views
-5

代碼在這裏,它刪除列表中的某個元素。 循環條件中的zip和枚舉有什麼區別? 似乎枚舉產量錯誤的結果。for循環中zip和enumerat之間的區別?

def delete(elem_l, del_e): 
    n_del = 0 
    for e, i in zip(elem_l, range(len(elem_l))): 
    # for i, e in enumerate(elem_l): 
     print "cycle:", i, "elem:", elem_l[i - n_del], "len:", len(elem_l) 
     if e == del_e: 
      del elem_l[i - n_del] 
      n_del += 1 


elem_list = [1, 2, 3, 4, 3, 5, 5, 4, 3] 
delete(elem_list, 3) 
+1

爲什麼不能簡單地搜索[Python文檔](https://docs.python.org/2.7/)這些內置的功能,看看他們做了什麼? – Jkdc

+0

您不應該從正在迭代的列表中刪除項目。 – Kevin

+0

爲什麼「for」每個週期都不計算「zip」? –

回答

2

問題在這裏是您使用的zip() function。它產生列表元組前面。您創建了添加了數字的原始列表的副本。從文檔:

此函數返回元組,其中個元組包含來自每個參數序列或iterables的個元素的列表。

強調我的

因此,在循環改變elem_l不影響循環迭代計數。

在另一方面enumerate()產生指數按需,並且隨着elem_l列表是從刪除,有更少的元件,以產生。你會得到相同的結果,如果你生產的elem_l一個副本,而不是:

for i, e in enumerate(elem_l[:]): 

其中[:]身份切片產生一個新的列表,獨立於原始elem_l名單,那麼你從循環刪除。

+0

我明白了,非常感謝。 –