我一直在尝试使用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行。
谢谢!
答案 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中列表中包含匹配项的列表,您需要使用:
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]
中提取项目,检查matches
中是否有“容器”,并将其添加到列表,如果他们这样做。 (旁注:另一个会返回相同结果的列表理解是nomatches = set(List1) - set(matches)
,这更易于阅读。)
解决这个问题:如果你想来自List1的 List2 中没有匹配 > ,您可以使用我在上面指定的算法获得List1
列表,然后,如评论中所述的Ali SAID OMAR,使用集合操作:
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 匹配的元素。或者,如果您想在一个声明中使用解决方案:
nomatches2 = [item for item in List2 if not any(key in item for key in List1)]
在信用到期时给予信用,这与帖子评论中的yedpodtrzitko解决方案相同。
虽然很难说出你在问什么,但是在评论中你已经翻了一下你至少要问过的一次,我会再增加两个算法:
nomatches2 = set(List2) - set(matches2)
this
event.currentTarget
每个都已通过您帖子中描述的测试用例进行了测试,并返回了预期的结果。如果这些算法不能满足您的需求,请仔细检查一下这不是问题,如果这不能解答您的问题,请确保您明确了解您的要求。感谢。