检查列表数组是否包含另一个列表中的元素

时间:2014-08-21 03:45:14

标签: python python-2.7

给定一个列表数组 a ,另一个列表 b d 。如何检查 b (或其他示例, d )中 a 中的列表元素是否存在?我知道我可以用 a 来表示元素的循环并检查每个元素是否在 b / d 中,但是有没有API快点吗?

 a = [[1,4], [17,33,2],[2,33]]

 b = [1,4,5,6]
 c = [[1,4]]

 d = [2,33]
 e = [[17,33,2],[2,33]]

让我们这样说,给列表 a b ,如何有效地编写下面的循环?让我们使用列表理解在一行中说明。

        newls = []
        for sublist in a:
           newls.append(list(set(sublist).intersection(set(b))))  

4 个答案:

答案 0 :(得分:3)

我怀疑这是你真正想要的,但这是你所要求的,即一行列表理解产生与你的for循环相同的结果:

newls = [list(set(sublist).intersection(set(b))) for sublist in a]

a = [[1,4], [17,33,2],[2,33]]
b = [1,4,5,6]
>>> c = [list(set(sublist).intersection(set(b))) for sublist in a]
>>> c
[[1, 4], [], []]

你可能不希望那里有空列表,所以:

>>> c = filter(None, [list(set(sublist).intersection(set(b))) for sublist in a])
>>> c
[[1, 4]]

请注意,这并未给出第二种情况的预期结果:

a = [[1,4], [17,33,2],[2,33]]
d = [2,33]
e = filter(None, [list(set(sublist).intersection(set(d))) for sublist in a])

>>> e
[[33, 2], [33, 2]]

答案 1 :(得分:2)

与上面评论中提到的barmer一样:使用列表理解可以轻松找到两个列表的交集:

a = [[1,4], [17,33,2],[2,33]]
b = [[1,4], [1,2], [2,3], [2,33]]

print [x for x in a if x in b] # prints [[1, 4], [2, 33]]

答案 2 :(得分:1)

如果您关心的是代码的紧凑性而不是速度,您可以使用set API,这将告诉您是否同时存在a,b和c中的元素(并告诉您哪些)

len(set(sum(a,[])) & set(b) & set(c).is_empty())>0

这对于速度来说并不算太糟糕,因为集合的交集是有效的,但求和函数不是,所以你可以用{{{m}中建议的任何方式优化sum(a,[])位。 3}}

此外,如果你只想知道是否有一个共同的元素,而不是知道所有共同的元素,你可以进一步优化,你必须实现更脏和更脏的代码。

答案 3 :(得分:0)

检查列表(字典)是否包含其他列表中的元素

a = [{'id':1,'val':4},{'id':17,'val':33},{'id':2,'val':33}]
b = [1,4,5,6,17]
print([x for x in a if x['id'] in b])

Demo

如果列表(字典)包含另一个列表中的元素,则检查并检索特定值

a = [{'id':1,'val':4,'code':'008'},{'id':17,'val':33,'code':'005'},{'id':2,'val':33}]
b = [1,4,5,6,17]
print([x['val'] for x in a if x['id'] in b])

Demo