【问题标题】:Cross Matching in pythonpython中的交叉匹配
【发布时间】:2012-10-20 07:07:42
【问题描述】:

有两个列表

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)]

【问题讨论】:

  • 您能否澄清一下,因为如果您只想匹配一个子字符串,"2311""31" 都将匹配字符串"asasa2311"?在这种情况下,新列表将是 ["2311", "1441", "31"]

标签: python list search


【解决方案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']

【讨论】:

    【解决方案2】:

    你应该在这里使用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']
    

    【讨论】:

    • 这里不必使用正则表达式,但这也不是一个糟糕的解决方案。 :)
    【解决方案3】:

    您能否澄清这个问题,因为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']
    

    【讨论】:

    • 哦忘了说明参考列表不一定以匹配的子字符串结尾
    • 在这种情况下,此答案中第一个建议的解决方案就是您正在寻找的解决方案。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    相关资源
    最近更新 更多