如何从嵌套列表中删除匹配项?
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 的原始问题
你的代码有一些错误,我会一一解决:
if re.search('abc.+', y) in x:
re.search
returns None
如果找不到,那么你可以删除 in x
+
在abc.+
中搜索了1个或多个,既然要匹配abc
,把+
改成?
匹配0个或更多
如果您要从更深的列表中删除所有元素,您将以一个空列表结束操作,因此让我们添加一个检查并删除空列表:
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']]
我有一个包含列表的列表,我想从每个列表中删除一个通配符匹配项(如果存在),否则 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']]
你的代码有一些错误,我会一一解决:
if re.search('abc.+', y) in x:
re.search
returnsNone
如果找不到,那么你可以删除in x
+
在abc.+
中搜索了1个或多个,既然要匹配abc
,把+
改成?
匹配0个或更多如果您要从更深的列表中删除所有元素,您将以一个空列表结束操作,因此让我们添加一个检查并删除空列表:
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']]