[英]Remove element from list if it satisfies a condition defined from a separate list - Python
我有兩個長度相等的清單:
Offset = [-0.0002, -0.0004, -0.0004, -0.006, -0.0006, -0.0006, -0.0066, -0.0007, -0.0007, -0.0008]
Ratio = [0.0641, 0.152, 0.254, 0.246, 0.3197, 0.3249, 2.8795, 0.4286, 0.5191, 0.5712]
我想做的是創建一個列表,其元素起源於Offset,前提是Ratio中對應的元素小於2.5
。 因此,對於上面的兩個列表,Ratio中的第6個元素大於2.5
,然后我要刪除Offset中的第6個元素並返回所有其他元素。
我嘗試進行列表理解,我的嘗試是:
Data = [x for n in Ratio[n] for x in Offset if Ratio[n] < 2.5]
但是,這會產生錯誤“ numpy.float64”對象不可迭代”,通過閱讀此問題,我可以看到為什么會收到錯誤,但是我不確定如何使列表理解工作。
這個for循環似乎在正確的軌道上,但是a)我更喜歡列表理解,b)我不認為您可以在迭代列表時刪除列表中的元素。
for n in range(len(Ratio)):
if Ratio[n] < 2.5:
#Keep the element Offset[n]
else:
#Delete the element Offset[n]
這將產生您要查找的列表。 關鍵是當列表包含相應元素時使用zip
(如果需要,請使用izip
)。
[offset for offset, ratio in zip(Offset, Ratio) if ratio < 2.5]
從錯誤消息聽起來
'numpy.float64' object is not iterable'
那Ratio
是一個numpy數組。 如果Offset
和Ratio
均為NumPy數組,則可以使用
Offset[Ratio < 2.5]
例如:
In [1]: import numpy as np
In [2]: Ratio = np.array([0.0641, 0.152, 0.254, 0.246, 0.3197, 0.3249, 2.8795, 0.4286, 0.5191, 0.5712])
In [3]: Offset = np.array([-0.0002, -0.0004, -0.0004, -0.006, -0.0006, -0.0006, -0.0066, -0.0007, -0.0007, -0.0008])
In [7]: Offset[Ratio < 2.5]
Out[7]:
array([-0.0002, -0.0004, -0.0004, -0.006 , -0.0006, -0.0006, -0.0007,
-0.0007, -0.0008])
您可以使用enumerate
使原始列表理解起作用。
Data = [x for (i, x) in enumerate(Offset) if Ratio[i] < 2.5]
在python 2.7中證明比zip
快但比izip
慢:
from time import time
from itertools import izip
Offset = [-0.0002, -0.0004, -0.0004, -0.006, -0.0006, -0.0006, -0.0066, -0.0007, -0.0007, -0.0008]
Ratio = [0.0641, 0.152, 0.254, 0.246, 0.3197, 0.3249, 2.8795, 0.4286, 0.5191, 0.5712]
def _enumerate():
return [x for (i, x) in enumerate(Offset) if Ratio[i] < 2.5]
def _zip():
return [offset for offset, ratio in zip(Offset, Ratio) if ratio < 2.5]
def _izip():
return [offset for offset, ratio in izip(Offset, Ratio) if ratio < 2.5]
assert _enumerate() == _zip() == _izip()
for f in (_enumerate, _zip, _izip):
start = time()
for i in range(10000):
f()
print '%s: %s' % (time() - start, f.func_name)
輸出:
0.0142180919647: _enumerate
0.0157129764557: _zip
0.0130951404572: _izip
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.