你知道吗?如果数组是由字典组成的,如果直接用set去重数组中的字典,会报错:`test=[{"a":1},{"a":1},{"a":3},{"b":4}]``test=list(set(test))``>>>TypeError:unhashabletype:'dict'`因为使用set去重的前提是对象是不可变对象,但是字典是可变对象,因此不能使用此方法对它们进行去重。那么如何解决这个问题呢?有三种方法。1.使用reduce方法reduce()函数会将参数序列中的元素累加起来。例如:`fromfunctoolsimportreduce``>>>defadd(x,y):#添加两个数字``...returnx+y``...``>>>reduce(add,[1,2,3,4,5])#计算列表和:1+2+3+4+5``15`上面的写法也可以简化为:`fromfunctoolsimportreduce``>>>reduce(lambdax,y:x+y,[1,2,3,4,5])#使用lambda匿名函数``15`因此,我们写了一个函数来对数组中的字典进行去重:`fromfunctoolsimportreduce``data=[{"a":1},{"a":1},{"a":3},{"b":4}]``result=[]``defunduplicate(result,data):``如果数据不在结果中:``result=result+[data]``returnresult``foriindata:``result=unduplicate(result,i)``>>>result``>>>[{'a':1},{'a':3},{'b':4}]`有点复杂,如果使用reduce函数和lambda函数,代码可以简化很多:`defdelete_duplicate(data):``func=lambdax,y:x+[y]ifynotinxelsex``data=reduce(func,[[],]+data)``returndata``>>>delete_duplicate(数据)``>>>[{'a':1},{'a':3},{'b':4}]`当然,我也可以在一行中编写此函数:data=reduce(lambdax,y:x+[y]ifynotinxelsex,[[],]+data)是可能的可能会在工作站被打死,所以不建议这样做2.奇怪的技巧文章开头提到,字典之所以不能用set去重,是因为它是一个可变对象。但是……如果我们把它变成一个不可变的对象呢?`data=[{"a":1},{"a":1},{"a":3},{"b":4}]``defdelete_duplicate(data):``immutable_dict=set([str(item)foritemindata])``data=[eval(i)foriinimmutable_dict]``returndata``>>>delete_duplicate(data)``>>>[{'a':1},{'a':3},{'b':4}]`是的,这会起作用。1.遍历字典,将每个子项转成字符串存入数组,然后使用set函数去重。2.使用eval函数将去重数组中的每个子项转换回字典。那么Python,怎么能不好玩呢?3、高效方式上面有两种风骚的操作,但是在实际工作中不推荐使用。一个原因是实在是太撒娇了,怕被打趴在办公桌上。另一个原因是它们在处理大数据量时表现不佳。下面是最正统的方式:`data=[dict(t)fortinset([tuple(d.items())fordindata])]``>>>data``>>>[{'a':1},{'b':2}]`其实和第二种方法是一样的,就是把数组中的每一个字典都转成一个tuple,也就是一个不可变对象,然后用set去重.去重后,使用dict函数将元组重组为字典对。但是这种方法不适用于字典中字典的数据结构,所以对于字典中字典的去重,例如:data2=[{"a":{"b":"c"}},{"a":{"b":"c"}}]在这种情况下,我建议使用第二种方法去重:`data2=[{"a":{"b":"c"}},{"a":{"b":"c"}}]``defdelete_duplicate_str(data):``immutable_dict=set([str(item)foritemindata])``data=[eval(i)foriinimmutable_dict]``returndata``print(delete_duplicate_str(data2))``>>>[{'a':{'b':'c'}}]`这三种方式你都学会了吗?如果觉得有收获,记得收藏哦。以后遇到类似的去重场景可以拿出来看一下。这是我们文章的结尾。如果喜欢今天的Python实战教程,请继续关注Python实战宝典。有问题可以在公众号后台回复:进群,回答对应的红字验证信息,进入互助群提问。原创不易,希望大家能在下方点赞观看支持我继续创作,谢谢!点击下方阅读原文,更好的阅读体验Python实战宝典(pythondict.com)不只是合集欢迎关注公众号:Python实战宝典
