>>TypeError: unhashable type : 'dict' 因为使用set去重的前提是该对象为不可变对象,而字典是可变对象,因此无法直接使用该方法去重。 那么怎么解决这个问题呢?有三个办法。 1.使用reduce方法 reduce() 函数会对参数序列中元素进行累积。 比如: from functools import reduce> >> def add ( x, y ) : # 两数相加 ... return x" />
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 字典组成的数组怎么进行去重

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-01 10:55 次阅读

你知道吗?如果数组是字典组成的,直接对数组内的字典采用set的方式进行去重,会报错:

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

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

那么怎么解决这个问题呢?有三个办法。

1.使用reduce方法

reduce() 函数会对参数序列中元素进行累积。

比如:

from functools import reduce
> >>def add(x, y) :            # 两数相加
...    return x + y
...
> >>reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+5
15

上述写法也能用lambda函数简化为:

from functools import reduce
 >> > reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数
15

因此,我们自己编写一个函数进行数组内的字典去重:

from functools import reduce

data = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]
result = []
def unduplicate(result, data):
    if data not in result:
        result = result + [data]
    return result

for 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)

只不过有可能会被打死在工位上,所以不建议这么干。

2.奇怪的技巧

就如文章开头提到的,字典之所以不能用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 data
print(delete_duplicate_str(data2))

 >> > [{'a': {'b': 'c'}}]

怎么样,这三种方式你都学会了吗?

如果觉得有收获的话记得收藏一下。以后遇到类似的去重场景时可以拿出阅读一下。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 参数
    +关注

    关注

    11

    文章

    1773

    浏览量

    32075
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62409
  • python
    +关注

    关注

    55

    文章

    4778

    浏览量

    84439
  • 数组
    +关注

    关注

    1

    文章

    414

    浏览量

    25903
收藏 人收藏

    评论

    相关推荐

    Python元组和字典使用的基本方法

    Python学习:2、元组、字典使用的基本方法
    发表于 04-06 15:12

    python——元组,集合,字典

    python——元组,集合,字典(tuple,set,dict)
    发表于 05-22 12:30

    python字典

    python字典字典(英文名 dict),它是由一系列的键值(key-value)对组合而成的数据结构。字典中的每个键都与一个值相关联,其中键,必须是可 hash 的值,如字符串,数值
    发表于 02-23 16:54

    python字典高阶用法

    ()进行集合运算,items()同样可以进行集合运算。如果现在我们要获取两个字典中 key,value 完全相同的部分。dic1 = {'Python': 1, 'Java': 2,
    发表于 03-29 17:39

    python合并字典的 7 种方法

    模块,它专门用于操作可迭代对象。正好我们字典也是可迭代对象,自然就可以想到,可以使用 itertools.chain() 函数先将多个字典(可迭代对象)串联起来,组成一个更大的可迭代对象,然后再
    发表于 04-08 15:11

    python字典类型的使用和注意事项

    字典类型在实际的python开发中,使用特别频繁,结合本人多年的工作经验,现将字典的使用以及字典使用注意事项总结如下:
    的头像 发表于 01-19 17:49 3488次阅读
    <b class='flag-5'>python</b><b class='flag-5'>字典</b>类型的使用和注意事项

    如何在Python3中合并字典

    如何在Python3中合并字典,首先给定一个字典,然后计算它们所有数字值的和。这里可以使用update() 方法,第二个参数合并第一个参数或者使用 **,函数将参数以字典的形式导入两种
    的头像 发表于 12-14 09:08 1739次阅读
    如何在<b class='flag-5'>Python</b>3中合并<b class='flag-5'>字典</b>

    python字典是什么

    python字典 字典(英文名 dict),它是由一系列的键值(key-value)对组合而成的数据结构。 字典中的每个键都与一个值相关联,其中 键,必须是可 hash 的值,如字符串
    的头像 发表于 02-23 16:54 3427次阅读

    Python-字典

    dictionary (字典) **是除列表外** Python **中,最灵活的数据类型
    的头像 发表于 02-16 15:02 610次阅读
    <b class='flag-5'>Python</b>-<b class='flag-5'>字典</b>

    Python基础语法-字典

    字典Python中一种常见的数据类型用于存储具有映射关系的数据。
    的头像 发表于 02-23 14:06 982次阅读
    <b class='flag-5'>Python</b>基础语法-<b class='flag-5'>字典</b>

    Python字典组成数组如何进行?

    因为使用set的前提是该对象为不可变对象,而字典是可变对象,因此无法直接使用该方法
    的头像 发表于 02-24 13:58 837次阅读
    <b class='flag-5'>Python</b><b class='flag-5'>字典</b><b class='flag-5'>组成</b>的<b class='flag-5'>数组</b>如何<b class='flag-5'>进行</b><b class='flag-5'>去</b><b class='flag-5'>重</b>?

    简述python字典映射嵌套排序和判断

    python字典是一种键值映射,而不是序列。 字典是通过键来存储对应值。序列是通过索引位置来存储对应值。
    的头像 发表于 02-27 14:52 703次阅读

    Python序列的字典类型介绍

    , 大括号 {} + 键值对 k,v 字典Python 项目中最常用的序列类型之一, 对应Java 中常用的 Json 数据类型 操作 字典的创建 通过 {} + kv 来创建 通过dict()来
    的头像 发表于 03-08 17:35 1283次阅读
    <b class='flag-5'>Python</b>序列的<b class='flag-5'>字典</b>类型介绍

    Python字典组成数组怎么进行

    你知道吗?如果数组字典组成的,直接对数组内的字典采用set的方式进行
    的头像 发表于 10-17 11:26 445次阅读

    Python列表的4种方式

    列表Python中一种常见的处理方式,任何编程场景都可能会遇到需要列表的情况。 列表
    的头像 发表于 11-02 10:46 1351次阅读
    <b class='flag-5'>Python</b>列表<b class='flag-5'>去</b><b class='flag-5'>重</b>的4种方式