检查列表数组是否包含另一个列表中的元素
给定一个列表 a,还有另外两个列表 b 和 d。我怎么能检查列表 a 中的元素是否存在于 b(或者说在 d 中)呢?我知道可以用一个循环遍历 a 的每个元素,然后检查它是否在 b 或 d 里,但有没有什么简单的方法可以更快地做到这一点呢?
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
检查一个字典列表是否包含另一个列表中的元素
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])
检查并获取特定值,如果字典列表包含另一个列表中的元素
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])
1
如果你更在意代码的简洁,而不是运行速度的话,可以使用集合(set)这个工具。它可以帮你检查某个元素是否同时出现在a、b和c这三个地方(还会告诉你具体是哪些元素)。
len(set(sum(a,[])) & set(b) & set(c).is_empty())>0
在速度方面,这个方法还算不错,因为集合的交集运算是很高效的。不过,求和的功能就没那么快了,所以你可以尝试优化一下sum(a, [])这部分,具体可以参考如何将列表中的列表变成一个平坦的列表。
另外,如果你只想知道有没有共同的元素,而不需要知道所有的共同元素,那你可以进一步优化,不过这样可能会让代码变得越来越复杂。
4
正如上面评论中提到的,找出两个列表的交集其实很简单,可以用列表推导式来实现:
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]]
4
我觉得这可能不是你真正想要的,但这就是你要求的,也就是一个一行的列表推导式,它能产生和你的循环一样的结果:
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]]