首先要做的事情是:您手头的列表理解是错误的。要完成一个包含 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
和元素xs
,List2
并尝试查看是否xs
包含在 中s
,这本质上与我们想要做的相反。
[s for s in list2 if any(xs in s for xs in list1)]
- 您的新算法反转了错误的变量。现在它正在拉出s
并检查是否在-List2
这更接近最初的想法。唯一的问题是,您的算法的设置方式,如果它们有匹配项,它将把项目放入列表中(这可能是你想要的吗?)xs
List1
xs
s
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]
,阅读起来更直观。)
顺便说一句:如果您想从 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)
这些中的每一个都已通过您在帖子中描述的测试用例进行了测试,并返回了预期的结果。如果这些算法不能满足您的需求,请仔细检查这对您来说不是问题,如果这不能回答您的问题,请确保您清楚您的问题. 谢谢。