匹配两个列表之间的相似元素

时间:2018-07-24 07:46:46

标签: python arrays python-3.x pandas keyword-search

我是python的新手,所以很抱歉,这是一个愚蠢的问题。

我有两个列表
 L1=['marvel','audi','mercedez','honda']

L2=['marvel comics','bmw','mercedez benz','audi']

我想提取list L2中包含与list L1匹配的匹配元素。所以我做了什么:

for i in L1:
   for j in L2:
       if j in i:
          print (j)

  output is ['audi']

但是,如果元素也包含任何单词匹配,例如{{1}中的mercedezmercedez benz中的marvel,我也想返回元素。因此最终输出将是:

marvel comics

6 个答案:

答案 0 :(得分:4)

我认为您真正想要的是L2的元素,其中包含L1中的任何元素。因此,只需将if j in i替换为if i in j

for i in L1:
   for j in L2:
       if i in j:
          print (j)

这将输出:

marvel comics
audi
mercedez benz

答案 1 :(得分:1)

如果您想使用regular expressions,则可以执行以下操作:

import re
re.findall(".*|".join(L1),"\n".join(L2))

['marvel comics', 'mercedez benz', 'audi']

答案 2 :(得分:0)

这是使用str.startswith

的一种方法

例如:

L1=['marvel','audi','mercedez','honda']  
L2=['marvel comics','bmw','mercedez benz','audi']
res = []
for i in L2:
    for j in L1:
        if i.startswith(j):
            res.append(i)
print(res)

输出:

['marvel comics', 'mercedez benz', 'audi']

使用in

例如:

res = []
for i in L2:
    for j in L1:
        if j in i:
            res.append(i)
print(res)

答案 3 :(得分:0)

一种行之有效的方法是建立一个“扁平”词典,每个单词作为关键字,而相关单词组作为值。

L2=['marvel comics','bmw','mercedes benz','audi']    
match_dict = {k:v for v in L2 for k in v.split()}

这是:

{'audi': 'audi',
 'benz': 'mercedes benz',
 'bmw': 'bmw',
 'comics': 'marvel comics',
 'marvel': 'marvel comics',
 'mercedes': 'mercedes benz'}

现在扫描第一个列表并在字典中发布元素:

L1=['marvel','audi','mercedes','honda']
result = [match_dict[x] for x in L1 if x in match_dict]

结果:

['marvel comics', 'audi', 'mercedes benz']

一旦构建了字典,您就可以扫描高性能的大型列表(O(1)查找)

答案 4 :(得分:0)

使用列表理解:

[j for i in L1 for j in L2 if (j.startswith(i))]

['marvel comics', 'audi', 'mercedez benz']

答案 5 :(得分:-1)

对代码进行一些更改

for i in L2:
    for j in L1:
        if j in i:
            print (i)