0

我有两个长度相等的列表:

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' object is not iterable',通过阅读 这个问题,我可以看到为什么会出现错误,但我不确定如何使列表理解起作用。

这个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]
4

3 回答 3

4

这将产生您寻找的列表。关键是在您有包含相应元素的列表时使用zip(或者izip如果您愿意)。

[offset for offset, ratio in zip(Offset, Ratio) if ratio < 2.5]
于 2013-09-04T17:11:41.090 回答
4

从错误消息中听起来

 'numpy.float64' object is not iterable'

Ratio是一个numpy数组。如果两者Offset都是RatioNumPy 数组,那么您可以使用

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])
于 2013-09-04T17:22:47.183 回答
0

您的原始列表理解可以使用enumerate.

Data = [x for (i, x) in enumerate(Offset) if Ratio[i] < 2.5]


这证明比 Python 2.7 更快zip但比izipPython 2.7 慢:

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
于 2013-09-04T17:47:06.120 回答