>>TypeError:unhas" />
Python 字典组成的数组怎么进行去重? |
您所在的位置:网站首页 › realmeq是什么手机 › Python 字典组成的数组怎么进行去重? |
你知道吗?如果数组是字典组成的,直接对数组内的字典采用set的方式进行去重,会报错: test = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]test = list(set(test))>>>TypeError: unhashable type: 'dict'因为使用set去重的前提是该对象为不可变对象,而字典是可变对象,因此无法直接使用该方法去重。 那么怎么解决这个问题呢?有三个办法。 reduce() 函数会对参数序列中元素进行累积。 比如: from functools import reduce>>>def add(x, y) : # 两数相加... return x + y... >>>reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+515上述写法也能用lambda函数简化为: from functools import reduce>>> reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数15因此,我们自己编写一个函数进行数组内的字典去重: from functools import reducedata = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]result = []def unduplicate(result, data): if data not in result: result = result + [data] return resultfor i in data: result = unduplicate(result, i)>>> result>>> [{'a': 1}, {'a': 3}, {'b': 4}]稍显复杂,如果使用reduce函数和lambda函数,代码能简化很多: def delete_duplicate(data): func = lambda x, y: x + [y] if y not in x else x data = reduce(func, [[], ] + data) return data>>> delete_duplicate(data)>>> [{'a': 1}, {'a': 3}, {'b': 4}]当然, 我也能一行写完这个功能: data = reduce(lambda x, y: x + [y] if y not in x else x, [[], ] + data)只不过有可能会被打死在工位上,所以不建议这么干。 就如文章开头提到的,字典之所以不能用set去重,是因为它是可变对象。 但是...如果我们把它变成不可变对象呢? data = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]def delete_duplicate(data): immutable_dict = set([str(item) for item in data]) data = [eval(i) for i in immutable_dict] return data>>> delete_duplicate(data)>>> [{'a': 1}, {'a': 3}, {'b': 4}]没错,这能成。 1.遍历字典,将每个子项变成字符串存放到数组中,再通过set函数去重。 2.通过eval函数,将去重后的数组里的每个子项重新转化回字典。 如此Python,怎能不好玩? 3.高效的方式上面讲了两种骚操作,其实都不太建议在实际工作中使用。 一个原因是真的太骚了,怕被打趴在工位上。 另一个原因是,它们在应对较大数据量的时候,性能不太行。 下面是最正统的方式: data = [dict(t) for t in set([tuple(d.items()) for d in data])]>>>data>>>[{'a': 1}, {'b': 2}]其实和第二种方式一样,是将数组内的每个字典转成元组,也就是不可变对象,再使用set进行去重。去重完毕后再使用dict函数将元组重新组成字典对。 但是,这种方法对于字典内还有字典的数据结构是不适用的,因此对于字典对里还有字典情况的去重,比如: data2 = [{"a": {"b": "c"}}, {"a": {"b": "c"}}]这种情况我建议使用第二种方式去重: 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 dataprint(delete_duplicate_str(data2))>>> [{'a': {'b': 'c'}}]怎么样,这三种方式你都学会了吗? 如果觉得有收获的话记得收藏一下。以后遇到类似的去重场景时可以拿出阅读一下。 我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。 有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。 原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢! 点击下方阅读原文可获得更好的阅读体验 Python实用宝典 (pythondict.com)不只是一个宝典欢迎关注公众号:Python实用宝典 ![]() |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |