在列表中的元素中搜索子字符串并删除该元素

Posted

技术标签:

【中文标题】在列表中的元素中搜索子字符串并删除该元素【英文标题】:Searching for substring in element in a list an deleting the element 【发布时间】:2012-10-08 19:53:18 【问题描述】:

我有一个列表,我正在尝试删除其中包含 'pie' 的元素。这就是我所做的:

['applepie','orangepie', 'turkeycake']
for i in range(len(list)):
    if "pie" in list[i]:
         del list[i]

我不断让列表索引超出范围,但是当我将 del 更改为 print 语句时,它会很好地打印出元素。

【问题讨论】:

如果'pie' 总是在最后,你可以使用字符串的endswith 方法。如果这是您想要做的,它会更有效(对于长字符串,对于短字符串它将几乎相同)并且更清晰。 (附带说明:startswith 也存在)。 【参考方案1】:

不要从您正在迭代的列表中删除一个项目,而是尝试使用 Python 的漂亮 list comprehension syntax 创建一个新列表:

foods = ['applepie','orangepie', 'turkeycake']
pieless_foods =  [f for f in foods if 'pie' not in f]

【讨论】:

foods = ['applepie','orangepie', 'turkeycake'] pie_foods = [f for f in foods if 'pie' not in f](不确定'not in'是否是正确的语法。 @AJ。谢谢,理解错了 - 我已经纠正了 非常简短的回答。将是最简单的解决方案【参考方案2】:

在迭代过程中删除元素,改变大小,导致IndexError。

您可以将代码重写为(使用列表理解)

L = [e for e in L if "pie" not in e]

【讨论】:

【参考方案3】:

类似:

stuff = ['applepie','orangepie', 'turkeycake']
stuff = [item for item in stuff if not item.endswith('pie')]

修改您正在迭代的对象应该被视为不行。

【讨论】:

【参考方案4】:

你得到错误的原因是因为你在删除某些东西时改变了列表的长度!

例子:

first loop: i = 0, length of list will become 1 less because you delete "applepie" (length is now 2)
second loop: i = 1, length of list will now become just 1 because we delete "orangepie"
last/third loop: i = 2, Now you should see the problem, since i = 2 and the length of the list is only 1 (to clarify only list[0] have something in it!).

所以宁愿使用类似的东西:

for item in in list:
    if "pie" not in item:
        new list.append(item)

【讨论】:

【参考方案5】:

另一种但更长的方法是记下遇到 pie 的索引并在第一个 for 循环后删除这些元素

【讨论】:

你仍然有同样的问题 - 除非你以相反的顺序删除元素。但这仍然没有效率,因为删除一个元素意味着每次都必须将所有后面的元素打乱。创建一个新列表非常有效,您无需复制元素,只需创建对它们的额外引用。

以上是关于在列表中的元素中搜索子字符串并删除该元素的主要内容,如果未能解决你的问题,请参考以下文章

在字符串数组中搜索子字符串的最有效方法

如何在 C# 中搜索字符串数组中的子字符串

EWS 搜索子字符串的约会正文

在 MariaDB 中搜索子字符串或单词

在 PostgreSQL 列中搜索子字符串

如何在数组键中搜索子字符串?