2013-07-12 54 views
0

我遍歷Python中的元組列表,我覺得中間的元素在某種程度上被跳過了。這裏是我的代碼塊,用進球來刪除具有None作爲第二元素的任何元組:迭代可能會跳過一個元素

print('List of tuples before modification: ' +str(list_of_tuples)) 
for refseq_tuple in list_of_tuples: 
    print('tuple: ' +str(refseq_tuple)) 
    if refseq_tuple[1] == None: 
     list_of_tuples.remove(refseq_tuple) 
print('List of tuples after modification: ' +str(list_of_tuples)) 

,這裏是輸出:

List of tuples before modification: [('100652761', None), ('100653343', None), ('3183', 0)] 
tuple: ('100652761', None) 
tuple: ('3183', 0) 
List of tuples after modification: [('100653343', None), ('3183', 0)] 

所以......發生了什麼中間(第二)元素?它看起來好像根本不被迭代,或者它會在其他兩個元組之間打印。

+0

可能重複(http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating-in-python ) –

+2

您在迭代*時修改列表*。迭代器索引不知道你刪除的項目,並繼續增加,因此似乎跳過項目。 –

+1

另外,通常使用相等來檢查「無」,這是不被接受的。改用'is'。 –

回答

1

正如其他人指出的那樣,您在修改列表的同時迭代它。然而,你可以用列表理解來完成你在這裏做的事情(除非出於某種原因你確實需要修改)。的[從列表中刪除項目,而在Python迭代]

list_of_tuples = [tup for tup in list_of_tuples if tup[1] is not None] 
+1

即使您需要進行適當的修改,使用列表理解的切片分配(或更好的是,生成器表達式)會更好。 – kindall

1

您已更改原始列表。所以這次索引1指的是('3183', 0)

>>> alist = [('100652761', None), ('100653343', None), ('3183', 0)] 
>>> [x for x in alist if not x[1] is None] 
[('3183', 0)] 
>>>