1

假设 a = [(1, 'CA'), (2, 'NY)] b = [2,3,4,5,6]

如果 el[0] 不在 b 中,如何删除 a 中的 el?在这种情况下,我想删除 (1, 'CA') 因为 1 不在 b 上。我尝试在 list_a 中使用 for el 但由于列表不断变化,它没有用。谢谢!!

4

2 回答 2

1

由于您将反复检查元素是否在 中b,请先转换b为集合,因此每次检查都是O(1)而不是O(n). 然后你可以使用列表理解

[el for el in a if el[0] in bset]

a = [(1, 'CA'), (2, 'NY')]
b = [2,3,4,5,6]
bset = set(b)

a = [el for el in a if el[0] in bset]
print(a)

产量

[(2, 'NY')]

注意:如果a真的很短,转换为集合实际上更快:

In [4]: %timeit bset = set(b); [el for el in a if el[0] in bset]
1000000 loops, best of 3: 580 ns per loop

In [5]: %timeit [el for el in a if el[0] in b]
1000000 loops, best of 3: 335 ns per loop

但是,如果a很长,那么转换b为一个集合确实会得到回报:

In [47]: a = a*1000

In [48]: %timeit bset = set(b); [el for el in a if el[0] in bset]
10000 loops, best of 3: 157 us per loop

In [49]: %timeit [el for el in a if el[0] in b]
10 loops, best of 3: 37.2 ms per loop
于 2013-07-17T09:09:39.510 回答
1

这是一个班轮。bset=set(b)只执行一次

>>> a = [(1, 'CA'), (2, 'NY')]
>>> b = [2, 3, 4, 5, 6]
>>> a[:] = filter(lambda x, bset=set(b): x[0] in bset, a)
>>> a
[(2, 'NY')]
于 2013-07-17T11:59:36.103 回答