2014-11-03 147 views
0

我想寫一個函數,通過矩陣(數組數組),並刪除其中包含一個特定值的所有行。舉個例子,我的基質看上去例如像這樣:如果特定值顯示,刪除矩陣中的矩陣

a = [[[1,2,3], [1,3,2], [0,2], 0, True], 
[[2,1,3], [1,3,2], [4,3], 2, False], 
[[4,3,1], [9,2,1], [5,2], 1, True], 
[[3,1,4], [5,2,1], [5,4], 2, False]] 

我想刪除包含在最後一列是一個虛假的所有行,這樣我就結了:

a = [[[1,2,3], [1,3,2], [0,2], 0, True], 
[[4,3,1], [9,2,1], [5,2], 1, True]] 

我試過除其他事項外本:

def rmRows(a): 
for i in range(len(a)-1): 
    if a[i][4] == False: 
    a.remove(a[i]) 
return a 

,但似乎並沒有工作。任何想法如何解決?

+0

相關:[Lo操作「忘記​​」刪除一些項目](http://stackoverflow.com/questions/17299581/loop-forgets-to-remove-some-items) – 2014-11-03 19:36:52

回答

0

而不是突變的列表,請嘗試只在必要時添加,所以把你的布爾表達式的恭維和重寫你的函數像這樣:

a = [[[1,2,3], [1,3,2], [0,2], 0, True], [[2,1,3], [1,3,2], [4,3], 2, False], [[4,3,1], [9,2,1], [5,2], 1, True], [[3,1,4], [5,2,1], [5,4], 2, False]] 

def rmRows(a): 
    b = [] 
    for row in a: 
     if row[-1] == True: 
      b.append(row) 
    return b 

print rmRows(a) 

給予:

[[[1, 2, 3], [1, 3, 2], [0, 2], 0, True], [[4, 3, 1], [9, 2, 1], [5, 2], 1, True]] 
+0

謝謝你,修復它。我添加了一個額外的行a = b,將完成的b數組重新命名爲a。 – andynitrox 2014-11-03 19:48:28

3

>>> [elem for elem in a if elem[-1] == True] 
[[[1, 2, 3], [1, 3, 2], [0, 2], 0, True], [[4, 3, 1], [9, 2, 1], [5, 2], 1, True]] 

現在反射回你的代碼,它不工作的原因是因爲你是變異而迭代序列的簡單列表理解會做的伎倆。每次你改變列表時,你的迭代器假設通過跳過元素指向下一個元素。

對於這種行爲,在SO中已經有幾個很好的答案了。

參見:Remove items from a list while iterating in Python

參見:Python: removing items from inner and outer for loop iterators