反向匹配 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 一个包含所有 un 的 set
对象剩余的匹配元素。或者,如果您想在一条语句中找到解决方案:
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 得到了预期的结果。如果这些算法不能满足您的需求,请仔细检查这不是您的问题,如果这不能回答您的问题,请确保您清楚自己的问题.谢谢。
我一直在尝试使用 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 一个包含所有 un 的 set
对象剩余的匹配元素。或者,如果您想在一条语句中找到解决方案:
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 得到了预期的结果。如果这些算法不能满足您的需求,请仔细检查这不是您的问题,如果这不能回答您的问题,请确保您清楚自己的问题.谢谢。