簡體   English   中英

如果滿足從單獨的列表定義的條件,則從列表中刪除元素-Python

[英]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數組。 如果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])

您可以使用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.

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