我在Python中有3个列表。
list_a = [10., 20., 30., 12.]
list_b = [30., 20., 60., 12.]
list_c = [10., 80., 90., 12.]
我想删除list_b
和list_c
中list_a
中<= 15
的值为list_b = [20., 60.]
list_c = [80., 90.]
的元素。因此结果变为:
CORS
有没有办法在没有for循环的情况下做到这一点? (列表理解是可以的)
答案 0 :(得分:8)
如果你正如你所说的那样使用numpy,那么在评论中你可以简单地从a
创建一个布尔索引并屏蔽b
和c
中的元素:
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_c
和list 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_b
和list_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]