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

4
我在Python中有3个列表。
list_a = [10., 20., 30., 12.]
list_b = [30., 20., 60., 12.]
list_c = [10., 80., 90., 12.]

我想要从list_blist_c中删除那些在list_a中的值<= 15。因此,结果变为:

list_b = [20., 60.]
list_c = [80., 90.]

有没有不使用for循环的方法来完成这个操作?(列表推导式可以)

1
没有循环?我不这么认为。而且 list_b 不应该是 [30.,20.,60.,] 吗? - Prajwal
你没有使用Numpy,是吗?使用Numpy数组可以轻松完成这个任务。 - David Z
@DavidZ 我正在使用numpy,那里有一种简洁的方法可以做到这一点吗? - user308827
@snakecharmerb 返回新列表没问题。 - user308827
6个回答

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.]

你可以使用.tolist()方法将lists_blist_c转换为Python的list类型

7
您可以使用鲜为人知的 itertools.compress 类来实现此功能。请参见使用布尔索引数组过滤列表
>>> 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]

5

您可以使用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)

2

你能使用列表推导式吗?

你可以这样做:

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) ]

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]

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]

这不是一个完整的答案。为了将来的参考,请添加解释。 - Mikkel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接