与Python反向匹配

时间:2016-03-15 12:24:38

标签: python python-2.7 string-matching inverse-match

我一直在尝试使用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行。
谢谢!

2 个答案:

答案 0 :(得分:0)

您所写的“匹配”会提供list2的值,而不是list1的值:     ['209583_345829', '57185372']

这就是为什么所描述的'set'方法不起作用的原因。您需要重写匹配,以便它返回list1中的项目,这些项目在list2中具有一些相应的值。

鉴于你的问题的描述,这应该有效:

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

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

答案 1 :(得分:0)

首先要做的事情:你手边的列表理解是错误的。要完成List1中列表中包含匹配项的列表,您需要使用:

所有项目FROM List1 WITH匹配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)] - 您的原始算法是从s中提取元素List1,从xs提取元素List2,并尝试查看xs是否包含在s[s for s in list2 if any(xs in s for xs in list1)],这本质上与我们想要做的相反。

s - 你的新算法颠倒了错误的变量。现在它从List2 xsList1 xss并检查List2是否在List1 - 这更接近原始想法。唯一的问题是,您的算法的设置方式是,如果[item for item in List1 if any(item in compared for compared in List2)]中有匹配项,那么它会将List1中的项目放入列表中(可能是什么你想要吗?)

List2 - 为了便于阅读而变得更加冗长,此算法会从[item for item in List1 for compared in List2 if item in compared]中提取项目,检查matches中是否有“容器”,并将其添加到列表,如果他们这样做。 (旁注:另一个会返回相同结果的列表理解是nomatches = set(List1) - set(matches) ,这更易于阅读。)

解决这个问题:如果你想来自List1的 List2 没有匹配 > ,您可以使用我在上面指定的算法获得List1列表,然后,如评论中所述的Ali SAID OMAR,使用集合操作:

列表1中的所有项目在列表2中没有匹配 - 设置操作

set

这将获取nomatches = [item for item in List1 if not any(item in compared for compared in List2)] 的所有唯一元素,删除匹配的元素,并返回一个matches2 = [item for item in List2 for key in List1 if key in item] 对象,其中包含所有 un 匹配的元素。或者,如果您想在一个声明中使用解决方案:

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

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

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

虽然很难说出你在问什么,但是在评论中你已经翻了一下你至少要问过的一次,我会再增加两个算法:

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

nomatches2 = set(List2) - set(matches2)

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

this

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

event.currentTarget

每个都已通过您帖子中描述的测试用例进行了测试,并返回了预期的结果。如果这些算法不能满足您的需求,请仔细检查一下这不是问题,如果这不能解答您的问题,请确保您明确了解您的要求。感谢。