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

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

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

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的。

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

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参数。例如:

import json
info = {'zel': 1, 'tel': 7384, 'name': 'kingname'}
info_json = json.dumps(info, sort_keys=True)
print(info_json)

运行效果如下图所示:

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

import json
a = [
      {'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)

运行效果如下图所示:


目录
相关文章
|
缓存 Ubuntu JavaScript
踩坑记录:QML加载图片资源
踩坑记录:QML加载图片资源
1829 0
|
弹性计算 网络协议 安全
【图文教程】阿里云服务器开放端口设置(超详细)
阿里云服务器端口怎么打开?云服务器ECS端口在安全组中开启,轻量应用服务器端口在防火墙中打开,阿里云服务器网以80端口为例,来详细说下阿里云服务器端口开放图文教程,其他的端口如8080、3306、443、1433也是同样的方法进行开启端口:
38979 2
|
存储 缓存 JavaScript
国内开源规则引擎牛起来
国内开源规则引擎牛起来
1311 0
|
11月前
|
机器学习/深度学习 自然语言处理 数据可视化
开箱即用!智能文档处理“百宝箱“
10 月 24 日至 26 日,CSDN 第五届“1024 程序员节”在长沙召开。合合信息的常扬老师分享了智能文档处理“百宝箱”,包括 TextIn ParseX、acge-embedding 和 markdown_tester 三种工具。这些工具解决了文档解析中的版式复杂、解析错误、语义信息丢失等问题,适用于文字工作者和机器学习研究人员。TextIn ParseX 是一个可视化工具,支持多种格式输出,acge-embedding 模型用于文本向量化,而 markdown_tester 则用于文档解析效果的定量评估。
202 0
|
传感器 机器学习/深度学习 人工智能
一文读懂大语言模型(上)
一文读懂大语言模型
444 0
|
测试技术 Swift iOS开发
探索iOS自动化测试:使用Swift编写UI测试
【8月更文挑战第31天】在软件开发的海洋中,自动化测试是保证船只不偏离航线的灯塔。本文将带领读者启航,深入探索iOS应用的自动化UI测试。我们将通过Swift语言,点亮代码的灯塔,照亮测试的道路。文章不仅会展示如何搭建测试环境,还会提供实用的代码示例,让理论知识在实践中生根发芽。无论你是新手还是有经验的开发者,这篇文章都将是你技能提升之旅的宝贵指南。
|
存储 网络协议 安全
阿里云hpc8ae实例商业化发布详解
近日,全球领先的云计算厂商阿里云宣布最新HPC优化实例hpc8ae的正式商业化,该实例依托阿里云自研的「飞天+CIPU」架构体系,搭载第四代AMD EPYC处理器,专为高性能计算应用优化,特别适用于计算流体、有限元分析、多物理场模拟等仿真类应用,CAE场景下的性价比最少提升50%。
|
机器学习/深度学习 Web App开发 人工智能
领航未来,探索AI无尽前沿:2023年WAIC云帆奖得主揭晓
领航未来,探索AI无尽前沿:2023年WAIC云帆奖得主揭晓
761 0
|
人工智能 Python
论文推荐:大型语言模型能自我解释吗?
这篇论文的研究主要贡献是对LLM生成解释的优缺点进行了调查。详细介绍了两种方法,一种是做出预测,然后解释它,另一种是产生解释,然后用它来做出预测。
103 2
|
存储 前端开发 数据库
桌面软件大屏通用交叉输入功能设计实例
桌面软件大屏通用交叉输入功能设计实例
138 0