Python:使用列表推导按子串列表过滤列表

时间:2016-12-07 22:29:55

标签: python string list list-comprehension substring

我认为这是一个简单的问题,所以我只是直接举一个例子。

鉴于这两个清单:

x = ['a', 'ab', 'abc', 'bc', 'c', 'ac']
y = ['a', 'b']

如何编写列表推导来过滤列表x,结果如下:

result = ['c']

我想要一个列表推导,它将y中字符串的任何部分匹配排除在x中的字符串之外。例如,' a'在y匹配' a',' ab',' abc'和' ac'在x。

此理解仅匹配整个字符串:result = [r for r in x if r not in y]

如果已经问过这个问题,我很乐意接受前一个答案的链接。那就是说,我还没有在SO上找到一个。

3 个答案:

答案 0 :(得分:12)

使用all

result = [r for r in x if all(z not in r for z in y)]

any

result = [r for r in x if not any(z in r for z in y)]

答案 1 :(得分:2)

这是any内置的作业。

>>> x = ['a', 'ab', 'abc', 'bc', 'c', 'ac']
>>> y = ['a', 'b']
>>> [r for r in x if not any(s in r for s in y)]
['c']

s in r执行您想要的部分匹配,for s in y检查y的所有元素,如果任何匹配,则any为真。然后我们反过来。

这是二次的,O(len(x) * len(y))。如果y很长,则合成正则表达式可能更有效:

>>> import re
>>> yy = re.compile("|".join(re.escape(s) for s in y))
>>> [r for r in x if not yy.search(r)]
['c']

应该只是O(len(x) + len(y))。

答案 2 :(得分:1)

这取决于y最佳方法的长度,如果它包含很多元素我会将其转换为集合并检查x中的任何项目是否有交集(一个常见字符)用它:

y = set(y)
[item for item in x if not y.intersection(item)]