从两个二维列表中删除重复项

时间:2015-08-10 12:43:00

标签: list python-3.x unique nested-lists

我搜索了一个解决方案来删除python中的两个2​​d列表中的deplicates我找不到所以这里我的问题:
我有两个列表,例如

[[1,2],[3,5],[4,4],[5,7]]

[[1,3],[4,4],[3,5],[3,5],[5,6]]

预期结果:

[[1,2],[1,3],[5,7],[5,6]]

我想删除列表中与其他列表的值完全匹配的列表。

我的剧本:

def filter2dim(firstarray, secondarray):
    unique = []
    for i in range(len(firstarray)):
       temp=firstarray[i]
       for j in range(len(secondarray)):
           if(temp == secondarray[j]):
              break
           elif(j==(len(secondarray)-1)):
               unique.append(temp)
    for i in range(len(secondarray)):
       temp=secondarray[i]
       for j in range(len(firstarray)):
           if(temp == firstarray[j]):
              break
           elif(j==(len(firstarray)-1)):
               unique.append(secondarray[i])
    return 

如果你解决它并解释你做了什么,那将是非常有益的。 谢谢你,最诚挚的问候

3 个答案:

答案 0 :(得分:2)

用元组替换你的2项列表,你可以使用set操作(因为元组是不可变的,列表不是,并且set items必须是不可变的):

a = {(1,2),(3,5),(4,4),(5,7)}
b = {(1,3),(4,4),(3,5),(3,5),(5,6)}
print(a.symmetric_difference(b)) # {(1, 2), (1, 3), (5, 6), (5, 7)}

请注意,这也会删除每个列表中的重复项,因为它们是集合,并且会忽略顺序。

如果您需要以编程方式将列表转换为元组,那么列表理解就可以了:

list_a = [[1,2],[3,5],[4,4],[5,7]]
set_a = {(i, j) for i, j in a}
print(set_a) # {(1, 2), (4, 4), (5, 7), (3, 5)}   

答案 1 :(得分:1)

您的脚本适用于我,只需添加:return unique

答案 2 :(得分:0)

将第一个列表转换为dict

a = [[1, 2], [3, 5], [4, 4], [5, 7]]
b = [[1, 3], [4, 4], [3, 5], [3, 5], [5, 6]]

filt = dict(a)
result = [el for el in b if el[0] in filt and el[0] == filt[el[0]]]

或者,将第一个列表转换为一组元组,然后检查成员资格:

filt = set(map(tuple, a))
result = [el for el in b if tuple(el) in filt]

这两种解决方案都避免多次迭代第一个列表,因为dictset查找是O(1)。