假设 a = [(1, 'CA'), (2, 'NY)] b = [2,3,4,5,6]
如果 el[0] 不在 b 中,如何删除 a 中的 el?在这种情况下,我想删除 (1, 'CA') 因为 1 不在 b 上。我尝试在 list_a 中使用 for el 但由于列表不断变化,它没有用。谢谢!!
假设 a = [(1, 'CA'), (2, 'NY)] b = [2,3,4,5,6]
如果 el[0] 不在 b 中,如何删除 a 中的 el?在这种情况下,我想删除 (1, 'CA') 因为 1 不在 b 上。我尝试在 list_a 中使用 for el 但由于列表不断变化,它没有用。谢谢!!
由于您将反复检查元素是否在 中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
这是一个班轮。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')]