为什么我的循环跳过第二个列表项?

时间:2018-06-25 15:16:21

标签: python

我想从列表中删除项目,但例外列表中定义的项目除外。但是,下面的代码跳过第二个条目,最多跳到“一个”,然后按预期方式处理其余的属性列表。为什么会这样?

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)

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如@khelwood和@Patrick Haugh所述,您需要使用AttributeList的副本。您正在遍历正在编辑的内容。

您是否出于某种原因需要这种方法?

如果我正确理解了您的目的,则只需要属性列表和期望列表的交集即可,如果这样,以下内容将涵盖您的用例:

library(tidyverse)
as.tibble(list) %>% 
  separate(value,letters[1:2], sep="_", remove = F, extra = "drop") %>% 
  unite(result, a,b, sep=" ")
# A tibble: 2 x 2
  value           result 
  <chr>           <chr>  
1 joe_joe_ID1000  joe joe
2 bob_bob_ID20000 bob bob

.Last.value %>% pull(result)
[1] "joe joe" "bob bob"

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如评论中所述,除非另有明确说明,否则python中的容器分配趋向于创建引用的副本,因此DeleteAttributes = AttributeList仅告诉python名称DeleteAttributes指向与{{ 1}};它不会创建新对象。为了确保您创建了一个新对象,尽管我不确定在python 2中是否可以工作,但是在python 3中您可以执行AttributeList;此外,您不必执行DeleteAttributes = AttributeList.copy();您可以只做for Exception in ExceptionList: if Exception == Attribute:。或者,您也可以将整个for循环替换为列表理解if Attribute in ExceptionList