通过迭代

时间:2015-08-24 16:03:00

标签: python

Python的相对新手。我试图编写一个函数来比较两个列表并删除任何重复的值:

>>> michael = ['Fox', 'Jackson', 'Jordan']
>>> not_michael = ['Smith', 'Brown', 'Jordan', 'Fox']
>>> result = michael_remover(michael, not_michael)
>>> result
['Smith', 'Brown']

然而,这是我一直得到的:

>>>result
['Smith', 'Brown', 'Fox']

这是我原来的功能代码:

def michael_remover(michael, not_michael):
    for name in not_michael:
        if name in michael:
            not_michael.remove(name)
    return not_michael

我最终改写了这个函数,并且按照预期工作:

def michael_remover(michael, not_michael):
    not_michael_2 = [name for name in not_michael if name not in michael]
    return not_michael2

然而,我很好奇为什么我的原始代码不起作用。谁能纠正/解释?它在我的大脑尖端,但我无法用语言表达...谢谢

1 个答案:

答案 0 :(得分:3)

您在迭代时更改列表。这会导致您看到的意外行为。在内部,for循环会跟踪您所在的索引。删除项目时,不处理下一个项目,因为它的索引现在是您刚刚处理的索引。

列表推导有效,因为它创建了一个新列表,而不是修改现有列表。因此它处理每个元素,并按预期工作。