Python 为什么我的循环会跳过每一个列表条目?

Python 为什么我的循环会跳过每一个列表条目?,python,Python,我想从列表中删除项目,例外列表中定义的项目除外。但是,下面的代码每秒跳过一个条目,最多跳过一个条目,然后按预期处理属性列表的其余部分。为什么呢 ExceptionList = ['uno', 'dos', 'tres', 'cuatro', 'OID'] AttributeList = ['uno', 'dos', 'tres', 'cuatro', 'OID', 'one', 'two', 'three', 'four', 'five'] DeleteAttributes = Attribut

我想从列表中删除项目,例外列表中定义的项目除外。但是,下面的代码每秒跳过一个条目,最多跳过一个条目,然后按预期处理属性列表的其余部分。为什么呢

ExceptionList = ['uno', 'dos', 'tres', 'cuatro', 'OID']
AttributeList = ['uno', 'dos', 'tres', 'cuatro', 'OID', 'one', 'two', 'three', 'four', 'five']
DeleteAttributes = AttributeList

print("Attributes: ", AttributeList)
print("Exception List: ", ExceptionList)

for Attribute in AttributeList:
        print("Attribute: ", Attribute)
    for Exception in ExceptionList:
            if Exception == Attribute:
            print("Exception: " + Attribute)
            DeleteAttributes.remove(Attribute)

print("Delete Attributes: ", DeleteAttributes)

for Attribute in DeleteAttributes:
        print("deleting.. ", Attribute)

我不太确定for在python中究竟是如何工作的。但我认为它会生成一个整数并在列表中迭代。
如果删除一个元素,则下一个元素的索引将减少,但for循环的递增整数保持不变,因此它将跳过下一个。

我不太确定for在python中究竟是如何工作的。但我认为它会生成一个整数并在列表中迭代。
如果删除一个元素,则下一个元素的索引将减少,但for循环的递增整数保持不变,因此它将跳过下一个元素。

如注释中所述,python中容器的赋值倾向于复制引用,除非另有明确说明,所以
DeleteAttributes=AttributeList
只是告诉python名称
DeleteAttributes
指向与
AttributeList
相同的对象;它不会创建新对象。为了确保创建新对象,在Python3中可以执行
DeleteAttributes=AttributeList.copy()
,尽管我不确定这在Python2中是否有效。此外,对于ExceptionList中的异常,您不必执行
:if Exception==属性:
;您只需在例外列表中执行
if属性即可。或者您可以用列表替换整个for循环
DeleteAttributes=[attr in AttributeList if not attr in ExceptionList]

如注释中所述,python中容器的赋值倾向于复制引用,除非另有特别说明,所以
DeleteAttributes=AttributeList
只是告诉python名称
DeleteAttributes
指向与
AttributeList
相同的对象;它不会创建新对象。为了确保创建新对象,在Python3中可以执行
DeleteAttributes=AttributeList.copy()
,尽管我不确定这在Python2中是否有效。此外,对于ExceptionList中的异常,您不必执行
:if Exception==属性:
;您只需在例外列表中执行
if属性即可。或者,您可以用列表替换整个for循环
DeleteAttributes=[attr in AttributeList if not attr in ExceptionList]

正如@khelwood和@Patrick Haugh所提到的,您需要一份AttributeList的副本用于您的方法。您正在对正在编辑的内容进行迭代

你需要这样的方法是有原因的吗

如果我正确理解了您的目的,您只需要属性列表和期望列表的交集,如果是这样的话,下面应该涵盖您的用例:

DeleteAttributes = list(set(ExceptionList).intersection(AttributeList))

正如@khelwood和@Patrick Haugh所提到的,您需要一份属性列表的副本用于您的方法。您正在对正在编辑的内容进行迭代

你需要这样的方法是有原因的吗

如果我正确理解了您的目的,您只需要属性列表和期望列表的交集,如果是这样的话,下面应该涵盖您的用例:

DeleteAttributes = list(set(ExceptionList).intersection(AttributeList))

DeleteAttributes=AttributeList这里DeleteAttributes指的是同一地址点。一旦您从DeleteAttributes列表中删除AttributeList的第一个匹配元素,就意味着您只从同一个列表中删除了。现在列表中的第二个元素变为第一个。因此,它将跳过每个匹配元素之后的第二个元素。

DeleteAttributes=AttributeList这里DeleteAttributes指的是同一地址点。一旦您从DeleteAttributes列表中删除AttributeList的第一个匹配元素,就意味着您只从同一个列表中删除了。现在列表中的第二个元素变为第一个。因此,它将跳过每个匹配元素之后的第二个元素。

您在迭代时正在更改
AttributeList
DeleteAttributes=AttributeList
不会创建副本,它只会将两个名称分配给指向同一列表对象。如果您打算将
DeleteAttributes
作为
AttributeList
的副本,可以尝试
DeleteAttributes=AttributeList.copy()
迭代时,您正在更改属性列表
DeleteAttributes=AttributeList
不创建副本,它只是将两个名称分配给指向同一列表对象。如果您打算将
DeleteAttributes
作为
AttributeList
的副本,您可以尝试
DeleteAttributes=AttributeList.copy()
DeleteAttributeList
不是副本“容器的浅层副本”。容器根本没有被复制。它正在使另一个名称引用同一对象。
DeleteAttributes=AttributeList
不是“容器的浅层副本”“。根本没有复制容器。它使另一个名称引用同一个对象。我需要根据例外列表检查后剩下的元素,因此您的方法工作良好,除了使用对称的_差而不是交叉。请注意,这将导致列表中每个元素只有一个副本,无论每个元素在原始列表中出现多少次,也不能保证它们的顺序相同。我需要在对照异常列表检查后剩余的元素,因此您的方法很有效,除了使用对称元素差而不是交集。请注意,这将导致列表中每个元素只有一个副本,无论每个元素在原始列表中出现多少次,也不能保证它们的顺序相同。如果不希望跳过元素,请执行以下操作:DeleteAttributes=AttributeList.copy()如果不希望跳过元素,请执行以下操作:DeleteAttributes=AttributeList.copy()