![](/img/trans.png)
[英]How to remove elements from a Python dictionary based on elements in a list?
[英]Remove elements from python list based on filter
我在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.]
有沒有辦法在沒有循環的情況下做到這一點? (列表理解還可以)
如果您正在使用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.]
您可以通過.tolist()
方法將lists_b
和list_c
轉換為Python list type
。
您可以使用鮮為人知的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]
您可以使用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)
你能使用列表推導嗎?
你可以這樣做:
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) ]
你可以像下面的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]
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.