簡體   English   中英

基於過濾器從python列表中刪除元素

[英]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_blist_c其中值list_a<= 15 因此結果變為:

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

有沒有辦法在沒有循環的情況下做到這一點? (列表理解還可以)

如果您正在使用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 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_blist_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM