2017-04-24 138 views
0

所以這是一個更大的數據集的一部分,但我在這裏簡化了它。假設您有以下代碼。我想要做的是提取子數組,基於什麼是中間元素(這就是dataStore的用途)。側面說明,我知道名單的可變性,並且當我做德爾行[1],我永遠會影響數據使用刪除刪除2D列表中的元素的問題

dataStore = [] 
data = [[1,3,7], [1,0,1],[2,0,2],[9,0,9], [3,1,9]] 
print(data) 
for index in range(0, 5): 
    temp = [] 
    for row in data: 
     if row[1] == index: 
      del row[1] 
      temp.append(row) 
      del data[ data.index(row)] 
    dataStore.append(temp) 

輸出是: Data: [[2, 0, 2]] DataStore: [[[1, 1], [9, 9]], [[3, 9]], [], [[1, 7]], []]

現在的數據應該是空的我」之後完成了,並且這裏的錯誤是(2,0,2)不會被刪除,因爲它與剛被刪除的東西背對背。你如何解決這個問題?

我如何處理事情:我覺得這是因爲當你做del data[ data.index(row)]時,它會將所有東西都移動一次,但是行仍然在前進。所以我想到的是第二個鏡像列表的解決方案,但我無法弄清楚它的語法

回答

0

你需要data數組在完成後是空的嗎?我不知道,但也許這是你在找什麼:

data = [[1,3,7], [1,0,1], [2,0,2], [9,0,9], [3,1,9]] 
dataStore = [] 
for index in range(0, 5): 
    for row in data: 
     if row[1] == index: 
      dataStore.append([row[0], row[2]]) 
print(dataStore) 

一切都只是存儲在新dataStore數組,而不是刪除當前data陣列英寸如果你正在迭代一個數組,你永遠不想修改它。輸出應該是:[[1, 1], [2, 2], [9, 9], [3, 9], [1, 7]]

請注意,這不是最有效的方法,但除非您處理的數據量非常大,否則您不會注意到。

+0

這是我最終選擇,但我最終拼接連續兩次因爲原來的問題將具有可變大小的方法 – Excal

0

你的感覺是正確的。作爲一個經驗法則,如果你正在迭代它,你絕不應該修改列表。

如果我正確理解你的問題,你的代碼的最終結果就是你應該在DataStore中有一個數組,這個數組中的每個元素都被中間元素排序,中間元素被刪除。如果是這樣的話,那麼我會嘗試的東西有點像這麼簡單:

dataStore = [[x[0],x[1]] for x in sorted(data,key=lambda i: i[1])] 
del data