在Python中删除多维数组中的重复项
我有一个二维数组
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]]