如何确定一个列表中的元素是否在另一个列表中?

Rya*_*ith 9 python list elements

我有两个清单:

A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
B = [12, 5]
Run Code Online (Sandbox Code Playgroud)

我试图找出A中哪些列表包含B中的元素(顺序无关紧要)并删除其余列表.

在这种情况下,答案是:

[[4, 5, 10, 12], [2, 5, 12, 13], [4, 5, 6, 12]]
Run Code Online (Sandbox Code Playgroud)

如果我们改变B并制作它B = [13],答案是:

[[2, 5, 13, 14], [2, 5, 12, 13]]
Run Code Online (Sandbox Code Playgroud)

Pad*_*ham 6

您可以使用set.issubset列表理解,使用A[:]将更改原始/列表对象A:

A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
B = [12, 5]
st = set(B)

A [:] = [sub for sub in A if st.issubset(sub)]

print(A)
[[4, 5, 10, 12], [2, 5, 12, 13], [4, 5, 6, 12]]
Run Code Online (Sandbox Code Playgroud)

同样的B = [13]

A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
B = [13]
st = set(B)

A [:] = [sub for sub in A if st.issubset(sub)]

print(A)
[[2, 5, 13, 14], [2, 5, 12, 13]]
Run Code Online (Sandbox Code Playgroud)

设置对象

s.issubset(t)s <= t测试s中的每个元素是否都在t中

对于非常大的A或者如果您有内存限制,您可以使用生成器表达式:

A [:] = (sub for sub in A if st.issubset(sub))
Run Code Online (Sandbox Code Playgroud)

如果订单永远不重要且可以设置我建议你从一开始就使用它们.在集合上执行查找会更有效率.

一些稍微大一点的时间A:

In [23]: A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12],[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12],[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]

In [24]: B = [12, 5]                                 
In [25]: timeit  filter(lambda x: all(y in x for y in B), A)
100000 loops, best of 3: 9.45 µs per loop

In [26]: %%timeit                                    
st = set(B)
[sub for sub in A if st.issubset(sub)]
   ....: 
100000 loops, best of 3: 3.88 µs per loop
 map(lambda x: not B_set-set(x), A)
In [27]: %%timeit
....: B_set = set(B)
....: map(lambda x: not B_set-set(x), A)
....: 
100000 loops, best of 3: 6.95 µs per loop
Run Code Online (Sandbox Code Playgroud)

如果您已将元素存储为A中的集合:

In [33]: %%timeit                             
st = set(B)
[sub for sub in A if sub >= st]
....: 
1000000 loops, best of 3: 1.12 µs per loop
Run Code Online (Sandbox Code Playgroud)

  • @Pedro:超过一定程度的代表你可以看到谁删除了答案.我向你保证,每个答案都被自己的作者删除了. (2认同)