列表理解以识别两个列表之间的字符串匹配

时间:2018-06-06 18:44:18

标签: python list-comprehension

我正在使用列表推导过滤list_a(一个大列表)中包含list_b(另一个大列表)中任何字符串的字符串。我已经能够成功地使用下面的代码生成list_a中具有此类匹配项的列表:

list_a_results = [s for s in list_a if any(xs in s for xs in list_b)]

现在我正在尝试做我正在考虑的反向过程,即确定list_b中列出的每个字符串list_a_results中显示的每个项目。是否有一种使用列表理解来实现此目的的好方法?

我想要完成的一个例子:给出时:

list_a_results = ['abc def ghi jkl', 'mno pqr', 'stu', 'vwx yz']
list_b = ['abc', 'ghi', 'pqr', 'stu', 'vwx', 'yz']

我希望能够生成以下内容:

matches_in_list_a = [['abc', 'ghi'], 'pqr', 'stu', ['vwx','yz']]

2 个答案:

答案 0 :(得分:1)

几乎是逐字解决方案:对于B的每个元素b,A s.t.的每个元素a。 a在b。

# constant depth result
res = [[s for s in list_b if s in a] for a in list_a_results]
# [['abc', 'ghi'], ['pqr'], ['stu'], ['vwx', 'yz']]

# desired output
itr = ([s for s in list_b if s in a] for a in list_a_results)
res2 = [x.pop() if len(x) == 1 else x for x in itr]
# [['abc', 'ghi'], 'pqr', 'stu', ['vwx', 'yz']]

答案 1 :(得分:0)

你已经拥有了自己喜欢的算法,好像你只想再做一次!

[s for s in list_b if any(xs in s for xs in list_a_results]

我不会嵌入这些理解,以避免重复计算结果很多次。如果你这么做的话,也许一个函数是有序的:

def anySubstrings(list_a,list_b):
    return [s for s in list_a if any(xs in s for xs in list_b)]

现在你的电话变成了:

anySubstrings(list_b,anySubstrings(list_a,list_b))