如何从列表中删除字符串项 [duplicate]

How to remove string items from a list [duplicate]

提问人:gwydion93 提问时间:11/17/2023 最后编辑:phogwydion93 更新时间:11/17/2023 访问量:42

问:

假设我有一个字符串项列表,如下所示:

myList = ['CLIPPOLY', 'ExternalCrosswalk','CrossReference', 'SourceCitation', 'Status', 'Waterbody', 'N_1_EDesc', 'N_1_ETopo', 'N_1_JDesc', 'N_1_JTopo', 'N_1_Props', 'Line']

我想从列表中删除任何带有“N_1”的项目。很简单吧?我试过这个:

 for item in myList:
     if 'N_1' in item:
         myList.remove(item)
         print("Removed item: {}".format(item))

这将输出:

Removed item: N_1_EDesc
Removed item: N_1_JDesc
Removed item: N_1_Props

当我再次打印出 myList 时,我仍然可以看到并非所有带有“N_1”的项目都被删除了。为什么会发生这种情况,我该如何解决?

 print(myList)

返回

['CLIPPOLY','ExternalCrosswalk','CrossReference','SourceCitation','Status','Waterbody','N_1_ETop', 'N_1_JTopo','Line']

注意 - 我也刚刚尝试创建一个我想要删除的名称列表,如下所示:

bad_list = ['N_1_EDesc', 'N_1_ETopo', 'N_1_JDesc', 'N_1_JTopo', 'N_1_Props']

然后,如果一个项目在bad_list中,我尝试将其删除,但我有相同的效果。

for item in myList:
    if item in bad_list:
        myList.remove(item)
        print("Removed item: {}".format(item))
Python 列表

评论

1赞 John Gordon 11/17/2023
问题在于,当您删除某个项目时,实际列表内容现在与原始循环不同步。for item in myList
1赞 John Gordon 11/17/2023
通常的解决方案是完全不修改原始列表,而是创建一个仅包含要保留的项目的新列表。
1赞 ShadowRanger 11/17/2023
@JohnGordon:如果需要确保原始别名的其他别名看到更改,则始终可以指定 to 来修改原始别名。作为奖励,它比 OP 试图做的事情要快;用 进行迭代,即使有效,也会是 ,而制作新的和替换原始内容只是几个操作。 似乎最接近OP的意图。myList[:]listlist.removeO(n²)listlistO(n)myList[:] = [item for item in myList if not item.startswith('N_1')]

答:

1赞 Ajay Pun Magar 11/17/2023 #1

我建议您使用如下所示的列表推导式:

myList=[x for x in myList if 'N_1' not in x]

上面的代码将通过采用不包含“N_1”的项目来覆盖现有列表。

评论

2赞 ShadowRanger 11/17/2023
如果是您尝试修改的别名(例如,调用方在收到参数时需要更改),则行为会有所不同,并且将其重新绑定到新的不会更改其他别名中的原始别名。这样做将修改原始别名,以便所有别名也看到更改。myListlistlistmyListlistlistmyList[:] = [x for x in myList if 'N_1' not in x]list