0

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

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

List2:这些数字与 list1 不同。(例如)['209583_345829', '57185372', '853921864']

现在我可以匹配并拉出我在下面找到的东西......但我也在寻找相反的东西;List1为所有不在的数字设置一个变量List2

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

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

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

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

谢谢!

4

2 回答 2

0

您所写的“匹配”给出了 from 的值list2,而不是 from list1['209583_345829', '57185372']

这就是为什么所描述的“设置”方法不起作用的原因。您需要重写匹配,以便它返回 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 中项目的所有数字的任何内容,而不仅仅是项目本身?

于 2016-03-15T19:53:04.547 回答
0

首先要做的事情是:您手头的列表理解是错误的。要完成一个包含 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)]- 您的原始算法是s从中提取元素List1和元素xsList2并尝试查看是否xs包含在 中s,这本质上与我们想要做的相反。

[s for s in list2 if any(xs in s for xs in list1)]- 您的新算法反转了错误的变量。现在它正在拉出s并检查是否在-List2这更接近最初的想法。唯一的问题是,您的算法的设置方式,如果它们有匹配项,它将把项目放入列表中(这可能是你想要的吗?)xsList1xssList2List1

[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],阅读起来更直观。)

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

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

nomatches = set(List1) - set(matches)

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

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

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

为了在应得的地方给予信任,这与 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)

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

于 2016-03-15T19:56:52.697 回答