我认为这是一个简单的问题,所以我只是直接举一个例子。
鉴于这两个清单:
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上找到一个。
答案 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)]