匹配两个列表之间的相似元素
matching similar elements in between two lists
我是 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']
但是,我也想要 return 个元素,如果它还包含任何单词匹配,例如 mercedez benz
中的 mercedez
和 marvel comics
中的 marvel
。所以最终输出将是:
j=['audi','mercedez benz','marvel comics']
这是一种使用 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)
一种高效的方法是构建一个 "flat" 字典,每个词作为键,相关词组作为值。
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)
查找)
我认为您在这里真正想要的是 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
如果您想使用 regular expressions
那么您可以这样做:
import re
re.findall(".*|".join(L1),"\n".join(L2))
['marvel comics', 'mercedez benz', 'audi']
使用列表理解:
[j for i in L1 for j in L2 if (j.startswith(i))]
['marvel comics', 'audi', 'mercedez benz']
我是 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']
但是,我也想要 return 个元素,如果它还包含任何单词匹配,例如 mercedez benz
中的 mercedez
和 marvel comics
中的 marvel
。所以最终输出将是:
j=['audi','mercedez benz','marvel comics']
这是一种使用 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)
一种高效的方法是构建一个 "flat" 字典,每个词作为键,相关词组作为值。
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)
查找)
我认为您在这里真正想要的是 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
如果您想使用 regular expressions
那么您可以这样做:
import re
re.findall(".*|".join(L1),"\n".join(L2))
['marvel comics', 'mercedez benz', 'audi']
使用列表理解:
[j for i in L1 for j in L2 if (j.startswith(i))]
['marvel comics', 'audi', 'mercedez benz']