Python 通过迭代从列表中删除值

Python 通过迭代从列表中删除值,python,Python,Python的相对新手。我试图编写一个函数来比较两个列表并删除任何重复值: >>> michael = ['Fox', 'Jackson', 'Jordan'] >>> not_michael = ['Smith', 'Brown', 'Jordan', 'Fox'] >>> result = michael_remover(michael, not_michael) >>> result ['Smith', 'Brown'

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

然而,我很好奇为什么我的原始代码不起作用。有人能纠正/解释吗?它就在我的脑子里,但我无法用语言表达。。。谢谢

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


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

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


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

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


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

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


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

您的代码可以工作。开心吗?你的代码很管用。开心吗?你的代码很管用。开心吗?你的代码很管用。高兴吗?