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