2013-07-12 29 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)] 
>>>