如果元素满足从单独列表 - Python定义的条件,则从列表中删除元素

时间:2013-09-04 17:09:37

标签: python list list-comprehension

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

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]

3 个答案:

答案 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数组。如果OffsetRatio都是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