如何从嵌套列表中删除匹配项?

How to remove matching item from nested list?

我有一个包含列表的列表,我想从每个列表中删除一个通配符匹配项(如果存在),否则 return 保持原样。

例子

nested_list = [["abc","fds","gfssdf"],["dfsdf","cds","dvc"],["dsaf","abcvs","ewq"],...]

我尝试做的是:

for x in nested_list :
    for y in x:
        if re.search('abc.+', y) in x:
            nested_list.remove(x)

但是 return 是同一个列表,没有任何变化

我想要的输出是:

nested_list = [["fds","gfssdf"],["dfsdf","cds","dvc"],["dsaf","ewq"],...]

有解决办法吗?

这是使用嵌套二维列表推导式执行此操作的一种方法:

nested_list = [["abc","fds","gfssdf"],["dfsdf","cds","dvc"],["dsaf","abcvs","ewq"]]
output = [[y for y in x if not re.search(r'^abc', y)] for x in nested_list]
print(output)  # [['fds', 'gfssdf'], ['dfsdf', 'cds', 'dvc'], ['dsaf', 'ewq']]

提供了一个很好的解决方案,但出于学习目的我想回答 OP 的原始问题


你的代码有一些错误,我会一一解决:

  1. if re.search('abc.+', y) in x:
    re.search returns None 如果找不到,那么你可以删除 in x

  2. +abc.+中搜索了1个或多个,既然要匹配abc,把+改成?匹配0个或更多

  3. 如果您要从更深的列表中删除所有元素,您将以一个空列表结束操作,因此让我们添加一个检查并删除空列表:

    if not x:
        nested_list.remove(x)
    

应用这些修复程序可以得到:

import re

nested_list = [["abc","fds","gfssdf"],["dfsdf","cds","dvc"],["dsaf","abcvs","ewq"], ["abc"]]

for x in nested_list :
    for y in x:
        if re.search('abc.?', y):
            x.remove(y)
            if not x:
                nested_list.remove(x)

print(nested_list)

给出了预期的输出:

[['fds', 'gfssdf'], ['dfsdf', 'cds', 'dvc'], ['dsaf', 'ewq']]

你可以测试in this online demo

您也可以使用 startswith 而不是 re:

>>> [[y for y in x if not y.startswith("abc")] for x in nested_list]
[['fds', 'gfssdf'], ['dfsdf', 'cds', 'dvc'], ['dsaf', 'ewq']]