1

有两个列表

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

我想要做的是对于 Experimental 中的元素,如果它们与 Reference 中的元素中的任何子字符串匹配,然后将 Experimental 中的匹配元素放在一个新列表中。

所以新列表将是

["2311","1441","31"]

我尝试做的是

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

3 回答 3

1

你应该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']
于 2012-10-20T07:18:29.667 回答
1

您能否澄清这个问题,因为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']
于 2012-10-20T07:13:06.887 回答
1

您的问题陈述与预期的输出不匹配。您说“子字符串”,但您的预期输出不包含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']

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

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

或者,如果您想在第一场比赛中更高效地突破,请使用生成器方法:

>>> 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']
于 2012-10-20T07:15:03.773 回答