在Python中删除多维数组中的重复项

11 投票
4 回答
18195 浏览
提问于 2025-04-16 04:44

我有一个二维数组

 xx=[[a,1],[b,2],[c,3]]

现在我想把里面的重复项去掉。对于简单的一维数组,可以用像这样的简单代码

xx=list(set(xx))

就能实现。但是在二维数组上使用集合(set)会报错

temp = set(xx)
TypeError: unhashable type: 'list'

一种解决办法是把二维数组的元素转换成字符串,然后对新的数组使用 list(set()) 来去重,最后再把所有元素转换回原来的形式。

在 Python 中有没有其他的解决方案呢?

4 个回答

2

这是我的解决方案,我故意把a[i][0]留成这样,以便你可以根据自己的需要来修改这个成员。

ab= [['2.71.122.116', 'test_sys_-fw.test_sys_.us'],
     ['10.10.100.26', 'test_sys_5k1'],
     [None, 'Azure'],
     [None, 'test-server'],
     ['2.71.122.119', 'asa-5506-fw'],
     ['33.151.18.23', 'netscaler1'],
     ['33.151.18.23', 'netscaler2'],
     ['33.151.18.23', 'Palo Alto'],
     ['33.151.18.23', 'Arbor CP'],
     ['44.221.2.100', 'fw-la5515'],
     ['44.221.2.101', 'fw-la2-5515'],
     ['44.221.2.99', 'NexusLA2'],
     ['44.221.2.103', 'ASALA5510'],
     ['2.71.122.120', 'asa-5506-fw2'],
     ['2.71.122.106', '2928_SW2']]

def deduplicate_by_ip(a):
    """
    Clears Empty ip address records from list
    removes duplicates by
    :param a:
    :return:
    """

    source_ips = []
    new_list = []
    for i in range(len(a)):
        if a[i][0] != None:
            if a[i][0] not in source_ips:
                source_ips.append(a[i][0])
                new_list.append(a[i])
    return new_list

list = deduplicate_by_ip(ab)
print("Total items in original list :", len(ab))
print("Total items after deduplication :", len(list))
print("The list", list)
3

在Manoj Govindan给出的优秀回答一年后,我想补充一点建议:

浮点数在比较的时候真的很麻烦……

比如说,

>>>0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 == 0.1*10

结果是:假

这是因为你的电脑不能准确地把小数浮点数表示成二进制数字(电脑只处理二进制/基数2的数字,而不是十进制/基数10的数字)。

所以在比较浮点数的时候一定要特别小心!

30

把元素转换成元组,然后使用 set

>>> xx=[['a',1],['b',2],['c',3],['c',3]]
>>> set(tuple(element) for element in xx)
set([('a', 1), ('b', 2), ('c', 3)])
>>> 

元组和列表不一样,元组是可以被“哈希”的。这意味着元组可以用来做一些特定的操作。而且,当你完成这些操作后,可以再把元素转换回列表。把这些步骤结合起来:

>>> [list(t) for t in set(tuple(element) for element in xx)]
[['a', 1], ['b', 2], ['c', 3]]

撰写回答