如何在Python中基于条件删除列表元素
我在python中有以下2D数组如何在Python中基于条件删除列表元素,python,list,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顺序和相应的AIC分数,我从下面的代码生成 a = [[0]*2 for
[[(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顺序和相应的AIC分数,我从下面的代码生成
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
的值。如果出现上述情况,我如何在中执行此操作如果您只想删除[0,0],则可以这样执行:
m = [[(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]]
for r in m:
if [0,0] in r:
m.remove(r)
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))
与
我们可以写一份清单
>>> [element for element in elements if element != [0,0]]
或者(我更容易理解)带谓词
def is_valid(element):
return element != [0, 0]
我们可以用like
我假设您有一个常规的Python列表,而不是NumPynp.ndarray
人们很容易认为就地解决方案比创建新列表更有效。事实并非如此,O(n)复杂性无法克服,因为您需要至少检查每个元素一次
因此,您可以使用列表理解:
res = [i for i in L if i != [0, 0]]
事实上,重复的list.remove
调用将效率低下:每个list.remove
调用都有O(n)。产生相同结果的不同方法是过滤列表并创建一个新的列表:
a = [e for e in a if any(e)]
您还可以使用内置的过滤器功能:
a = list(filter(any, a))
这样可以避免在每次从列表中删除一个元素时将所有元素移动。根据元素的条件需要删除列表中的列表(即列表列表)时的解决方案。这里我们删除任何元素为NaN的列表。使用e==e测试NaN。lofl是列表的列表
newlofl = [l for l in lofl if all(e == e for e in l)]
有人有更快更好的方法来解决这种情况吗?是否只删除最后一个[0,0]项?是的,只要有[0,0]项,我们就应该删除itArray或list?这是有区别的。@jpp删除,直到列表中没有[0,0]为止。我相信这将具有O(m*n)复杂性。它必须多次通过该列表才能获得所有结果。@jpp是的,很慢。那么如何从上面获得最低AIC分数指数呢?@Neil,这是一个单独的问题,我建议你问一个新问题。
a = list(filter(any, a))
newlofl = [l for l in lofl if all(e == e for e in l)]