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

时间:2015-06-10 18:15:25

标签: list python-3.x

我有一个字符串列表stringlist = ["elementOne" , "elementTwo" , "elementThree"],我想搜索包含"Two"字符串的元素,并从列表中删除它,这样我的列表就会变成stringlist = ["elementOne" , "elementThree"]

我设法打印了它们,但我们真的不知道如何使用del从列表中完全删除,因为我不知道索引或使用stringlist.remove("elementTwo")因为我不知道#39; t知道包含"Two"

的元素的确切字符串

到目前为止我的代码:

for x in stringlist:
   if "Two" in x:
       print(x)

5 个答案:

答案 0 :(得分:1)

当您遍历列表时,可以使用enumerate获取索引(但请注意,这不是一种在迭代时修改列表的pythonic和安全方法):

>>> for i,x in enumerate(stringlist):
...    if "Two" in x:
...        print(x)
...        del stringlist[i]
... 
elementTwo
>>> stringlist
['elementOne', 'elementThree']

但是,作为一种更优雅和pythonic的方式,您可以使用列表理解来保留不包含Two的元素:

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

答案 1 :(得分:1)

通常,当我们执行列表推导时,我们会构建一个新列表并为其指定与旧列表相同的名称。虽然这会得到理想的结果,但这不会删除旧的列表。

要确保引用保持不变,您必须使用:

>>> 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,并将列表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]

<强>方法-2:

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

>>> a1
[1]
>>> a2
[1]

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

答案 2 :(得分:0)

这样做可以帮到你

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

newList = []
for x in stringlist:
    if "Two" in x:
        continue
    else
        newList.append(x)

答案 3 :(得分:0)

使用正则表达式

import re

txt = ["SpainTwo", "StringOne"]
for i in txt:
    x = re.search(r"Two", i)
    if x:
        temp_list = temp_list + [x.string] if "temp_list" in locals() else [x.string] 

print(temp_list)

给予

['SpainTwo']

答案 4 :(得分:-1)

这很简单 - 抱歉所有麻烦

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