python中的交叉匹配

2024-10-04 01:31:57 发布

您现在位置:Python中文网/ 问答频道 /正文

有两个列表

Experimental = ["2311","1441","31","233122"]
Reference = ["asasa2311","dadewr1441","app"]

我要做的是对实验中的元素,如果它们匹配引用元素中的任何子字符串,然后将匹配的元素放入一个新的列表中。在

所以新的名单应该是

^{pr2}$

我试着做的是

[i for i in Experimental if any(sub in i for sub in Reference)]

Tags: 字符串inapp元素列表forifany
3条回答

您应该在此处使用regex

In [20]: e=["2311","1441","31","233122"]

In [21]: r=["asasa2311","dadewr1441","app"]

In [22]: [x for x in e if any(x in re.findall("\d+",y) for y in r)]
Out[22]: ['2311', '1441']

您的问题陈述与预期输出不匹配。您说“sub string”,但是您期望的输出不包含31,即使它是asasa1311的子字符串。以下是一种方法:

>>> e = ["2311","1441","31","233122"]
>>> r = ["asasa2311","dadewr1441","app"]
>>> [eelem for relem in r for eelem in e if eelem in relem]
['2311', '31', '1441']

或者如果您想要预期的输出:

^{pr2}$

或者,如果你想在第一场比赛中更有效率地爆发,可以使用生成器方法:

>>> e = ["2311","1441","31","233122"]
>>> r = ["asasa2311","dadewr1441","app"]
>>> [eelem for eelem in e if any(r if eelem in relem else False for relem in r)]
['2311', '1441', '31']

如果使用in返回布尔值的事实,则可以缩短一点:

>>> [eelem for eelem in e if any(eelem in relem for relem in r)]
['2311', '1441', '31']

你能解释一下这个问题,因为31也产生了一个匹配的子串asasa1311。在

In [516]: Experimental = ["2311","1441","31","233122"]
     ...: Reference = ["asasa2311","dadewr1441","app"]
     ...: 

In [517]: [i for i in Experimental for x in Reference if i in x ]
Out[517]: ['2311', '1441', '31']

相关问题 更多 >