我正在使用列表推导过滤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']]
答案 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))