我有一个二维数组
xx=[[a,1],[b,2],[c,3]]
现在我正在尝试从中删除重复的条目。对于简单的1-D数组,简单的代码如
xx=list(set(xx))
会奏效。但尝试在二维元素上设置会产生错误
temp = set(xx)
TypeError: unhashable type: 'list'
一种解决方法是序列化xx元素,然后在新数组上执行一个列表(set()),然后再次反序列化所有元素。
python中有什么解决方案吗?
答案 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)
如果顺序无关紧要,那么我认为(对于代码高尔夫球等而言)最简洁的方法是使用内置的map
,list
和tuple
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]]