前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 列表内字典去重

python 列表内字典去重

作者头像
葫芦
发布2019-05-14 16:45:59
4.6K0
发布2019-05-14 16:45:59
举报
文章被收录于专栏:葫芦

set可以去重list里的元素为int、float、str、tuple如下,但是不能去重list、set、dict如下:

代码语言:javascript
复制
>>> a=[(1,2),(1,2)]
>>> set(a)
set([(1, 2)])
>>> a=[[1,2],[1,2]]
>>> set(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

那么哪些是可哈希元素?哪些是不可哈希元素? 可哈希的元素有:int、float、str、tuple 不可哈希的元素有:list、set、dict

代码语言:javascript
复制
>>> list.__hash__
>>> int.__hash__
<slot wrapper '__hash__' of 'int' objects>
>>> tuple.__hash__
<slot wrapper '__hash__' of 'tuple' objects>

为什么 list 是不可哈希的,而 tuple 是可哈希的 (1)因为 list 是可变的在它的生命期内,你可以在任意时间改变其内的元素值。 (2)所谓元素可不可哈希,意味着是否使用 hash 进行索引 (3)list 不使用 hash 进行元素的索引,自然它对存储的元素有可哈希的要求;而 set 使用 hash 值进行索引。

综上所述,要去重列表内的 重复字典只能自己写方法了。

代码语言:javascript
复制
def list_dict_duplicate_removal(data_list):
    run_function = lambda x, y: x if y in x else x + [y]
    return reduce(run_function, [[], ] + data_list)
代码语言:javascript
复制
>>> a=[1,3,4,5,2,3,4]
>>> set(a)
set([1, 2, 3, 4, 5])
>>> a=[{"a":123,"b":342},{"a":213,"b":231},{"a":123,"b":221},{"a":123,"b":342}]
>>> set(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> def list_dict_duplicate_removal(data_list):
...     run_function = lambda x, y: x if y in x else x + [y]
...     return reduce(run_function, [[], ] + data_list)
...
>>> list_dict_duplicate_removal(a)
[{'a': 123, 'b': 342}, {'a': 213, 'b': 231}, {'a': 123, 'b': 221}]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档