基于过滤器从python列表中删除元素

时间:2017-01-02 09:16:01

标签: python list list-comprehension

我在Python中有3个列表。

list_a = [10., 20., 30., 12.]
list_b = [30., 20., 60., 12.]
list_c = [10., 80., 90., 12.]

我想删除list_blist_clist_a<= 15的值为list_b = [20., 60.] list_c = [80., 90.] 的元素。因此结果变为:

CORS

有没有办法在没有for循环的情况下做到这一点? (列表理解是可以的)

6 个答案:

答案 0 :(得分:8)

如果你正如你所说的那样使用numpy,那么在评论中你可以简单地从a创建一个布尔索引并屏蔽bc中的元素:

import numpy as np

list_a = np.array([10., 20., 30., 12.])
list_b = np.array([30., 20., 60., 12.])
list_c = np.array([10., 80., 90., 12.])

list_b = list_b[list_a>15]
list_c = list_c[list_a>15]

print list_a
print list_b
print list_c

输出:

[ 10.  20.  30.  12.]
[ 20.  60.]
[ 80.  90.]

您可以按lists_b方法将list_clist type转换为Python .tolist()

答案 1 :(得分:7)

您可以使用鲜为人知的itertools.compress类来执行此操作。见Filter list using Boolean index arrays

>>> import itertools
>>> list_a = [10., 20., 30., 12.]
>>> list_b = [30., 20., 60., 12.]
>>> list_c = [10., 80., 90., 12.]
>>> bool_list = [item > 15 for item in list_a]
>>> bool_list
[False, True, True, False]
>>> list_b = list(itertools.compress(list_b, bool_list))
>>> list_b
[20.0, 60.0]
>>> list_c = list(itertools.compress(list_c, bool_list))
>>> list_c
[80.0, 90.0]

答案 2 :(得分:4)

您可以使用zip()编写一行内容来过滤列表:

list_b, list_c = zip(*[(b, c) for a, b, c in zip(list_a, list_b, list_c) if a>15])

list_blist_c保留的最终值为:

>>> list_b
(20.0, 60.0)
>>> list_c
(80.0, 90.0)

答案 3 :(得分:1)

你能使用列表推导吗?

你可以这样做:

list_a = [10., 20., 30., 12.]
list_b = [30., 20., 60., 12.]
list_c = [10., 80., 90., 12.]
list_b = [ el for (i, el) in enumerate(list_b) if (list_a[i] > 15) ]
list_c = [ el for (i, el) in enumerate(list_c) if (list_a[i] > 15) ]

Snipper写在这里,我还没有测试过,但你看到了一般的想法。

我假设所有列表都是相同的长度。如果list_a更短并且您想要删除缺失位置上的元素,则可以这样做:

list_b = [ el for (i, el) in enumerate(list_b) if (i<len(list_a) and list_a[i] > 15) ]

如果你想保留它们,只需反转符号和布尔运算符:

list_b = [ el for (i, el) in enumerate(list_b) if (i>=len(list_a) or list_a[i] > 15) ]

答案 4 :(得分:1)

你可以zip()如下:

>>> list_a = [10., 20., 30., 12.]
>>> list_b = [30., 20., 60., 12.]
>>> list_c = [10., 80., 90., 12.]
>>>
>>> [j for i,j in zip(list_a, list_b) if i >= 15]
[20.0, 60.0]
>>>
>>> [j for i,j in zip(list_a, list_c) if i >= 15]
[80.0, 90.0]

答案 5 :(得分:0)

list_a = [10., 20., 30., 12.]
list_b = [30., 20., 60., 12.]
list_c = [10., 80., 90., 12.]
drop = [i for i,v in enumerate(list_a) if v <=15]
b = [v for i,v in enumerate(list_b) if not i in drop]
c = [v for i,v in enumerate(list_c) if not i in drop]