前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:包含非hashable元素的列表如何去重并保持顺序?

一日一技:包含非hashable元素的列表如何去重并保持顺序?

作者头像
青南
发布2019-06-11 19:53:42
1.1K0
发布2019-06-11 19:53:42
举报
文章被收录于专栏:未闻Code未闻Code

如果是一个包含数字的列表,我们要对它进行去重同时保持剩余数据的顺序,可以使用集合来实现:

代码语言:javascript
复制
a = [2, 1, 6, 3, 2, 7, 6]dup = set()a_uni = []for element in a:    if element not in dup:        a_uni.append(element)        dup.add(element)print(a_uni)

运行效果如下图所示:

然而,数字之所以可以放进集合里面,是因为数字是 hashable的对象。在Python中,所有不可变的对象都是 hashable的,例如数字、字符串、元组。而列表和字典不是 hashable的。

所以如果有这样一个列表:

代码语言:javascript
复制
a = [      {'name': 'kingname', 'salary': 99999},      {'name': 'yy', 'salary': 88888},      {'name': 'meiji', 'salary': 1},      {'name': 'Tom', 'salary': 100},      {'name': 'kingname', 'salary': 99999},    ]

继续使用上面的代码就会导致报错,如下图所示。

为了解决这个问题,我们需要把字典转换为 hashable的对象,此时方法有很多种,其中一种是使用 json.dumps把字典转换为JSON格式的字符串。

在Python 3.6之前,由于字典的顺序是不确定的,所以同一个字典,转换为JSON以后可能会出现顺序不一致的情况,这就会导致两个实际上相等的字典转成JSON字符串以后不相等。

所以需要把JSON字符串强制按照Key排序,那么就需要使用 json.dumpssort_keys参数。例如:

代码语言:javascript
复制
import jsoninfo = {'zel': 1, 'tel': 7384, 'name': 'kingname'}info_json = json.dumps(info, sort_keys=True)print(info_json)

运行效果如下图所示:

移除包含非 hashable元素的列表,就可以使用JSON字符串来辅助去重:

代码语言:javascript
复制
import jsona = [      {'name': 'kingname', 'salary': 99999},      {'name': 'yy', 'salary': 88888},      {'name': 'meiji', 'salary': 1},      {'name': 'Tom', 'salary': 100},      {'name': 'kingname', 'salary': 99999},    ]dup = set()a_uni = []for element in a:    element_json = json.dumps(element)    if element_json not in dup:        a_uni.append(element)        dup.add(element_json)print(a_uni)

运行效果如下图所示:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

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

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

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