Python 字典组成的数组去重

数组是字典组成的,直接对数组内的字典采用set的方式进行去重,会报错:

test = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]
test = list(set(test))
>>> TypeError: unhashable type: 'dict'

ps:

set 去重的前提是该对象为不可变对象,而字典是可变对象,因此无法直接使用该方法去重。

解决办法

1, reduce

from functools import reduce
data = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]
data = reduce(lambda x, y: x + [y] if y not in x else x, [[], ] + data)

2,可变对象 ==> 不可变对象

data = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]
data = [dict(t) for t in set([tuple(d.items()) for d in data])]

将数组内的每个字典转成元组,也就是不可变对象,再使用set进行去重。去重完毕后再使用dict函数将元组重新组成字典对。

3, 对于字典内还有字典的数据结构

data2 = [{"a": {"b": "c"}}, {"a": {"b": "c"}}]
def delete_duplicate_str(data):
    immutable_dict = set([str(item) for item in data])
    data = [eval(i) for i in immutable_dict]
    return data
print(delete_duplicate_str(data2))
  1. 遍历字典,将每个子项变成字符串存放到数组中,再通过set函数去重。
  2. 通过eval函数,将去重后的数组里的每个子项重新转化回字典。

你可能感兴趣的:(Python,python)