反向匹配 Python

Inverse Match with Python

我一直在尝试使用 Python 2.7 中的两个列表。我已经走了一半,但花了一些时间搜索并没有带来太多结果。

List1:是我在 List2 中搜索的特定数字序列的列表。 (例如)['209583', '185372', '684392', '995423']

List2:具有列表 1 中这些数字的变体。 (例如)['209583_345829', '57185372', '853921864']

现在我可以匹配并拉动我在下面找到的东西了……但我也在寻找相反的东西;将变量设置为 List1 中不在 List2.

中的所有数字
matching = [s for s in list2 if any(xs in s for xs in list1)]

所以不匹配的变量中应该留下的是'995423'。我已经尝试修改上面的代码,但我觉得它就在我眼皮底下。

此外,出于性能原因,仅使用 If/Else 语句是否有益?例如。如果匹配这样做,否则不匹配这样做......这样它只是 运行 一次 vs 两次。

这是一个简单的示例,但两者的列表每行可能超过 10,000 行。

谢谢!

你写的 "matching" 给出了来自 list2 的值,而不是来自 list1 的值: ['209583_345829', '57185372']

这就是所描述的 'set' 方法不起作用的原因。您需要重写匹配,以便 returns 列表 1 中的项目在列表 2 中具有相应的值。

根据您的问题描述,这应该有效:

non_match = [xs for xs in list1 if not any (xs in s for s in list2)]

不过,那个returns['684392', '995423']。我在 list2 中的任何地方都没有看到 684392;您是否在某个时候编辑了列表,或者您是否正在寻找 list2 中包含 list1 中项目的所有数字的任何内容,而不仅仅是项目本身?

首先要注意的是:您手头的列表理解有问题。要完成包含 List1 中的项目且在 List2 中具有匹配项的列表,您要使用此:

List1 中与 List2 匹配的所有项目

matches = [item for item in List1 if any(item in compared for compared in List2)]

说明:
[s for s in List1 if any(xs in s for xs in List2)] - 您的原始算法是从 List1 中提取元素 s 并从 List2 中提取元素 xs,并尝试查看 xs 是否包含在s,这与我们想要做的事情本质上是相反的。

[s for s in list2 if any(xs in s for xs in list1)] - 您的新算法反转了错误的变量。现在它从 List2 中拉出 s 并从 List1 中拉出 xs 并检查 xs 是否在 s 中——这更接近最初的想法.唯一的问题是,您的算法设置方式,如果 List2 中的项目在 List1 中匹配( 可能 到底是你想要的?)

[item for item in List1 if any(item in compared for compared in List2)] - 为了便于阅读而变得更冗长,该算法将从 List1 中提取项目,检查它们是否在 List2 中具有 'container',并将它们添加到列表中(如果有)。 (旁注:另一种 return 相同结果的列表理解是 [item for item in List1 for compared in List2 if item in compared],它读起来更直观。)

顺便提一下:如果您想从 List1 中获取每个 没有匹配项的项目List2 中,您可以使用我上面指定的算法来获得 matches 列表,然后,正如 Ali SAID OMAR 在评论中所述,使用集合操作:

List1 中的所有项目在 List2 中没有匹配项 - 集合操作

nomatches = set(List1) - set(matches)

这将获取 List1 的所有唯一元素,删除匹配的元素,并且 return 一个包含所有 unset 对象剩余的匹配元素。或者,如果您想在一条语句中找到解决方案:

List1 中的所有项目在 List2 中没有匹配 - 列表理解

nomatches = [item for item in List1 if not any(item in compared for compared in List2)]

为了在信用到期时给予信用,这与 post 评论中 yedpodtrzitko 的解决方案相同。

不过,由于很难说清你在问什么,而且在评论中你至少翻转了一次你在问什么,我将再添加两个算法:

List2 中的所有项目与 List1 中的匹配项

matches2 = [item for item in List2 for key in List1 if key in item]

List2 中的所有项目在 List1 中没有匹配项 - 列表理解

nomatches2 = [item for item in List2 if not any(key in item for key in List1)]

List2 中的所有项目在 List1 中没有匹配项 - 设置操作

nomatches2 = set(List2) - set(matches2)

其中每一项都已通过您在 post 中描述的测试用例进行了测试,并且 return 得到了预期的结果。如果这些算法不能满足您的需求,请仔细检查这不是您的问题,如果这不能回答您的问题,请确保您清楚自己的问题.谢谢。