我有两个相等长度的列表:
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'对象不可迭代',从阅读this question我可以看到为什么我得到错误,但我不知道如何使列表理解工作。
这个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]
答案 0 :(得分:4)
这将生成您寻找的列表。关键是当您拥有包含相应元素的列表时,使用zip
(或izip
,如果您愿意)。
[offset for offset, ratio in zip(Offset, Ratio) if ratio < 2.5]
答案 1 :(得分:4)
从错误消息中发出声音
'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])
答案 2 :(得分:0)
您的原始列表理解可以使用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