List 如果匹配字符串,则查找并删除列表元素

List 如果匹配字符串,则查找并删除列表元素,list,python-3.x,List,Python 3.x,我有一个字符串列表stringlist=[“elementOne”、“elementTwo”、“elementThree”],我想搜索包含“Two”字符串的元素,并将其从列表中删除,这样我的列表将变成stringlist=[“elementOne”、“elementThree”] 我设法打印了它们,但不知道如何使用del从列表中完全删除,因为我不知道索引或使用stringlist.remove(“elementTwo”)因为我不知道包含“Two”的元素的确切字符串 到目前为止,我的代码是: fo

我有一个字符串列表
stringlist=[“elementOne”、“elementTwo”、“elementThree”]
,我想搜索包含
“Two”
字符串的元素,并将其从列表中删除,这样我的列表将变成
stringlist=[“elementOne”、“elementThree”]

我设法打印了它们,但不知道如何使用
del
从列表中完全删除,因为我不知道索引或使用
stringlist.remove(“elementTwo”)
因为我不知道包含
“Two”的元素的确切字符串

到目前为止,我的代码是:

for x in stringlist:
   if "Two" in x:
       print(x)
您可以使用在迭代列表时获取索引(但请注意,这不是在迭代列表时修改列表的一种pythonic且安全的方法):

但是,作为一种更优雅、更通俗的方式,您可以使用列表理解来保存不包含
两个
的元素:

>>> stringlist = [i for i in stringlist if not "Two" in i]
>>> stringlist
['elementOne', 'elementThree']

这样做对你有帮助

for i,x in enumerate(stringlist):
    if "Two" in x:
        del stringlist[i]


这很简单,很抱歉给你添了这么多麻烦

for x in stringlist:
   if "Two" in x:
      stringlist.remove(x)

通常在执行列表理解时,我们会构建一个新列表,并将其命名为与旧列表相同的名称。虽然这将获得所需的结果,但这不会删除现有的旧列表。

要确保引用保持不变,必须使用以下选项:

>>> stringlist[:] = [x for x in stringlist if "Two" not in x]
>>> stringlist
['elementOne', 'elementThree']
优势:
由于它分配给一个列表片,它将用相同的Python列表对象替换内容,因此引用保持不变,从而防止在其他地方引用时出现一些错误

如果在下面执行此操作,将丢失对原始列表的引用

>>> stringlist = [x for x in stringlist if "Two" not in x]
>>> stringlist
['elementOne', 'elementThree']
因此,为了保留引用,您需要构建列表对象并为其分配列表切片。

要了解细微差别:

>>> a1 = [x for x in a1 if x<2]

>>> a1
[1]
>>> a2
[1,2,3,4]
>>> a1[:] = [x for x in a1 if x<2]

>>> a1
[1]
>>> a2
[1]
让我们获取一个包含一些元素的列表
a1
,并将列表
a2
指定为等于
a1

>>> a1 = [1,2,3,4]
>>> a2 = a1
方法1:

>>> a1 = [x for x in a1 if x<2]

>>> a1
[1]
>>> a2
[1,2,3,4]
>>> a1[:] = [x for x in a1 if x<2]

>>> a1
[1]
>>> a2
[1]
>>>a1=[x代表a1中的x,如果x>>a1
[1]
>>>a2
[1,2,3,4]
方法2:

>>> a1 = [x for x in a1 if x<2]

>>> a1
[1]
>>> a2
[1,2,3,4]
>>> a1[:] = [x for x in a1 if x<2]

>>> a1
[1]
>>> a2
[1]
>>a1[:]=[x代表a1中的x,如果x>>a1
[1]
>>>a2
[1]

方法-2实际上会替换原始
a1
列表的内容,而方法-1则不会。

通常情况下,修改正在迭代的列表是个坏主意。在这种情况下,是否因为使用enumerate()而有所不同?@TimCastelijns很好,你注意到了这一点,是的,实际上这样做并不安全,使用
枚举与否也没有任何区别!不要这样做。修改你正在迭代的列表可能会产生奇怪的结果和错误。你是对的,我在2k元素列表上这样做了,发现即使它删除了大多数元素在“两个”字符串中,我仍然发现4个元素“不知何故”跳过了删除。仍在尝试找出最佳解决方案。我会随时通知您。谢谢!