使用python中基于其他列表的列表推导过滤嵌套列表



我有两个这样的列表:

a = [[1,2,3],[2,3,4],[5,6,7],[7,8,9]]
b = [1,2]

我现在想要过滤列表a,只保留包含列表b中的项目的项目。所以期望的输出看起来像这样:

[[1,2,3],[2,3,4]]

我已经尝试了一些嵌套的列表推导,我可以想到,但无法得到所需的输出。如有任何建议,不胜感激。

你可以尝试这样做:

print([i for i in a if any(map(i.__contains__,b))])
>>> [[1, 2, 3], [2, 3, 4]]

我会尝试这样做:

a = [[1,2,3],[2,3,4],[5,6,7],[7,8,9]]
b = [1,2]
result = [lst for lst in a if any(x in lst for x in b)]

列表推导式和集合的组合将产生想要的结果。请注意;我假设重复的项和排序不重要,如果是这样的话——set将不起作用,因为它忽略了排序,只允许唯一的项。

一个简单的列表推导式就可以了,像下面的

filter_items = set(filter_items)
[sublist for sublist in original_list if not set(sublist).isdisjoint(filter_items)]

这个列表理解中主要有一个有趣的部分,即if not set(sublist).isdisjoint(filter_items)。这里只保留子列表,如果子列表的集合不与集合filter_items不相交,即没有一个filter_items在子列表中。

对于给定的示例,提供的答案将产生以下内容:

>>> a = [[1,2,3],[2,3,4],[5,6,7],[7,8,9]]
>>> b = set([1,2])
>>> [sublist for sublist in a if not set(sublist).isdisjoint(b)]
[[1, 2, 3], [2, 3, 4]]

使用set方法可以用相交来模拟in:

a = [[1,2,3],[2,3,4],[5,6,7],[7,8,9]]
b = [1,2]
b_as_set = set(b)
out = [l for l in a if b_as_set.intersection(l)]
# [[1, 2, 3], [2, 3, 4]]

我会尝试这样做。

a = [[1,2,3],[2,3,4],[5,6,7],[7,8,9]]
b = [1,2]
print([lst for lst in a if any([item in b for item in lst])])

最新更新