2017-01-22 438 views
0

說我有一個二維數組,如:比較2D陣列的第1列並刪除重複的Python

array = [['abc',2,3,], 
     ['abc',2,3], 
     ['bb',5,5], 
     ['bb',4,6], 
     ['sa',3,5], 
     ['tt',2,1]] 

我想刪除任何行,其中第一列重複
即比較陣列[0]和只返回:

removeDups = [['sa',3,5], 
     ['tt',2,1]] 

我想應該是這樣的: (設定第一欄爲TMP變量,比較TMP剩餘和#SET陣列從比較返回)

for x in range(len(array)): 
    tmpCol = array[x][0] 
    del array[x] 
    removed = compare(array, tmpCol) 
    array = copy.deepcopy(removed) 

print repr(len(removed)) #testing 

其中compare是: (比較TMP其餘每個陣列項目的第一個關口,如果比賽中刪除,否則返回原來的數組)

def compare(valid, tmpCol): 
for x in range(len(valid)): 
    if valid[x][0] != tmpCol: 
     del valid[x] 
     return valid 
    else: 
     return valid 

我不斷收到「索引超出範圍」的錯誤。我嘗試了其他方式來做到這一點,但我真的很感激一些幫助!你可以嘗試

+0

的人指數超出範圍的錯誤「是因爲你設置了' for'循環基於數組的初始長度,但是使用del語句將其縮短。所以,最終你會達到不再存在的指數。你可以使用'while'循環,但即使如此,這段代碼也不會完全按照你的想法做。 –

回答

0

類似於其他的答案,但使用字典而不是進口計數器:

counts = {} 

for elem in array: 
    # add 1 to counts for this string, creating new element at this key 
    # with initial value of 0 if needed 
    counts[elem[0]] = counts.get(elem[0], 0) + 1 

new_array = [] 
for elem in array: 
    # check that there's only 1 instance of this element. 
    if counts[elem[0]] == 1: 
     new_array.append(elem) 
1

一種選擇是創建一個櫃檯前手的陣列的第一列,然後根據計數值過濾列表,即,保持元件僅在第一個元素中只出現一次:

from collections import Counter 

count = Counter(a[0] for a in array) 
[a for a in array if count[a[0]] == 1] 
# [['sa', 3, 5], ['tt', 2, 1]] 
0

您可以使用字典並計算每個鍵的出現次數。 您也可以使用實際執行此操作的庫集合中的Counter

操作步驟如下:

from collection import Counter 

removed = [] 
for k, val1, val2 in array: 
    if Counter([k for k, _, _ in array])[k]==1: 
     removed.append([k, val1, val2])