python - 从列表中查找和排除多个匹配项的逻辑

标签 python logic

我需要用给定的模式匹配一​​个列表的内容,并形成另一个列表,该列表将包含除匹配项之外的所有内容。意思是,我正在尝试制作一个排除列表。

现在只需一个模式匹配,就很容易了。但是对于更多的人,它变得棘手。

让我们看一个例子:

Lmain=[arc123, arc234,xyz111,xyz222,ppp999,ppp888]

for count in range(len[Lmain]):

    if Pattern matches Lmain[i]:
              Pass
    else:result.append(Lmain[i])

现在假设 pattern = arc ,我的结果将是

result = [xyz111,xyz222,ppp999,ppp888]

这只是一个逻辑,我将使用正则 expr 来寻找匹配项。

现在如果我们有 2 个模式,那么在一个循环中使用上面的逻辑:

Pattern=['arc','xyz']

for pat in Pattern:
      if pat matches Lmain[i]:
          Pass
      else:result.append(Lmain[i])

这会给我们错误的结果

result = [xyz111,xyz222,ppp999,ppp888,arc123,arc234,ppp999,ppp888]

所以,你可以看到上面的逻辑是行不通的。

我的计划:

首先我们找到第一个模式的排除列表,这将给我们结果:

result = [xyz111,xyz222,ppp999,ppp888]

对于第二种模式,我们需要查看上面的结果。

if Pattern matches Result[i]:
      Pass
else:result_final.append(Result[i])

我认为我们需要使用递归来实现以上逻辑。现在我们该怎么做? 我们也不知道用户要输入的模式数量。它可以是一个或多个。

大家有什么逻辑思路,欢迎交流。

最佳答案

使用列表理解和生成器表达式,跳过构建排除列表的中间步骤,只构建最终列表:

>>> import re
>>> Lmain=['arc123', 'arc234', 'xyz111', 'xyz222','ppp999','ppp888']
>>> Pattern=['arc','xyz']
>>> [x for x in Lmain if not any(re.search(y, x) for y in Pattern)]
['ppp999', 'ppp888']

关于python - 从列表中查找和排除多个匹配项的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10702738/

相关文章:

python - 嵌套循环 Python

python - 是否可以创建一个快捷方式,使用 vscode-jupyter 打开光标下数据框的数据查看器?

python - 在嵌套(while)循环中的什么地方放置变量?

plot - gnuplot 中 'plot' 命令中的“if”语句

objective-c - 考虑到仅将选定的日期计入工作日,找到最终日期的逻辑是什么?

c - 数组游戏。为什么不更新打印?

python - 在 Python 中,如何从导入的模块访问主模块的命名空间?

python - 根据相似项目的数量有效地对集合进行分组

logic - 嗡嗡声难题

java - java中基于条件的逻辑编程