2017-01-22 393 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])