从python中的多维数组中删除重复的条目

时间:2010-09-29 06:45:28

标签: python arrays

我有一个二维数组

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

现在我正在尝试从中删除重复的条目。对于简单的1-D数组,简单的代码如

xx=list(set(xx))

会奏效。但尝试在二维元素上设置会产生错误

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

一种解决方法是序列化xx元素,然后在新数组上执行一个列表(set()),然后再次反序列化所有元素。

python中有什么解决方案吗?

4 个答案:

答案 0 :(得分:17)

将元素转换为元组,然后使用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]]

答案 1 :(得分:2)

在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)。

比较花车时要非常小心!

答案 2 :(得分:0)

这是我的解决方案,我有意离开了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 :(得分:0)

如果顺序无关紧要,那么我认为(对于代码高尔夫球等而言)最简洁的方法是使用内置的maplisttuple extended iterable unpacking和Python 3.5的additional unpacking generalizations

x = [["a", 1], ["b", 2], ["c", 3], ["c", 3], ["a", 1]]

*y,=map(list,{*map(tuple,x)})

print(y)
  

输出:

[['a', 1], ['b', 2], ['c', 3]]

See it live