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

新手上路,请多包涵

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

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

到目前为止我的代码:

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

原文由 faceoff 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 497
2 个回答

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

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

 >>> 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

方法一:

 >>> 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]

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

原文由 Rahul Gupta 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 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']

原文由 Mazdak 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进