【问题标题】:Iteration possibly skipping an element迭代可能会跳过一个元素
【发布时间】:2013-07-12 14:35:06
【问题描述】:

我正在遍历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)]

那么...中间(第二个)元素发生了什么?它看起来好像根本没有被迭代,或者它会在其他两个元组之间打印。

【问题讨论】:

  • 您在迭代时修改列表。迭代器索引不知道您删除了项目并继续增加,因此似乎跳过了项目。
  • 此外,使用相等来检查None 通常是不受欢迎的。请改用is
  • 好的抱歉,如果它是重复的,我确实尝试过先搜索。谢谢大家!看起来列表理解是要走的路。

标签: python python-3.x iteration


【解决方案1】:

正如其他人指出的那样,您在迭代列表时正在修改列表。但是,您可以通过列表理解来完成您在此处所做的事情(除非出于某种原因您确实需要就地修改)。

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

【讨论】:

  • 即使您需要就地修改,使用列表推导式的切片分配(或者更好的是,生成器表达式)会更好。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2023-01-11
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多