如何根据Python中的条件删除列表元素

时间:2018-08-09 08:03:52

标签: python list

我在python中有以下2D数组

[[(0, 0, 0), 337.94174378689814],
[(0, 0, 1), 339.92776762374007],
[(0, 0, 2), 338.78632729456444],
[(0, 1, 0), 344.85997106879347],
[(0, 1, 1), 331.6819890120493],
[0, 0]]

我要删除其中包含0个值的元素 输出为ARIMA order and corresponding AIC score,我是根据以下代码生成的

a = [[0]*2 for x in range(27)]

for i in range(len(pdq)):
   try:
      mod =  ARIMA(train, order = pdq[i]) 
      results = mod.fit(disp=False)
      a[i][0] = pdq[i]
      a[i][1] = results.aic
      if a[i][1] == 0:
         a.remove(a[i])
   except:
       continue

我想删除同时有0的数组中的值。我该如何在if condition described above

中进行操作

6 个答案:

答案 0 :(得分:3)

我假设您有一个普通的Python list,而不是NumPy np.ndarray

很容易想到就地解决方案比创建新列表更有效。实际情况并非如此,O(n)复杂性无法克服,因为您需要至少检查一次每个元素。

因此您可以为此使用列表理解:

res = [i for i in L if i != [0, 0]]

确实,重复的list.remove调用将效率低下:每个 list.remove调用具有O(n)time complexity

答案 1 :(得分:1)

如果您只想删除[0,0],可以这样操作:

a = [[(0, 0, 0), 337.94174378689814],
     [(0, 0, 1), 339.92776762374007],
     [(0, 0, 2), 338.78632729456444],
     [(0, 1, 0), 344.85997106879347],
     [(0, 1, 1), 331.6819890120493],
     [0, 0]]

while True:
    try:
        a.remove([0, 0])
    except ValueError:
        break

或使用过滤器:

a = list(filter(lambda x: x != [0, 0], a))

答案 2 :(得分:0)

column1

答案 3 :(得分:0)

使用

>>> elements = [[(0, 0, 0), 337.94174378689814],
                [(0, 0, 1), 339.92776762374007],
                [(0, 0, 2), 338.78632729456444],
                [(0, 1, 0), 344.85997106879347],
                [(0, 1, 1), 331.6819890120493],
                [0, 0]]

我们可以编写一个list理解力

>>> [element for element in elements if element != [0,0]]

或(更易于理解的IMO)带有谓词

def is_valid(element):
    return element != [0, 0]

我们可以像使用filter built-in

# wrapping in ``list`` because in Python3 ``filter`` returns iterator
>>> list(filter(is_valid, elements))  
[[(0, 0, 0), 337.94174378689814], 
 [(0, 0, 1), 339.92776762374007],
 [(0, 0, 2), 338.78632729456444], 
 [(0, 1, 0), 344.85997106879347],
 [(0, 1, 1), 331.6819890120493]]

答案 4 :(得分:0)

产生相同结果的另一种方法是过滤列表并创建一个新列表:

a = [e for e in a if any(e)]

您还可以使用内置的filter函数:

a = list(filter(any, a))

这样可以避免每次从列表中删除元素时都转移所有元素。

答案 5 :(得分:0)

需要根据元素的条件删除列表(即列表列表)中的列表时的解决方案。在这里,如果任何元素是NaN,我们将删除任何列表。使用e == e测试NaN。 lofl是列表的列表。

newlofl = [l for l in lofl if all(e == e for e in l)]

有人对这种情况有更快,更好的方法吗?