一日一技:包含非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)

运行效果如下图所示:


目录
相关文章
|
6月前
|
算法 前端开发 索引
过滤数组中的元素
过滤数组中的元素
50 0
|
9天前
按字典顺序排序
按字典顺序排序。
24 2
|
1月前
排序列表
排序列表。
16 3
|
2月前
不排序列表
不排序列表。
30 5
|
4月前
|
存储 语音技术 索引
语音识别,列表的定义语法,列表[],列表的下标索引,从列表中取出来特定的数据,name[0]就是索引,反向索引,头部是-1,my[1][1],嵌套列表使用, 列表常用操作, 函数一样,需引入
语音识别,列表的定义语法,列表[],列表的下标索引,从列表中取出来特定的数据,name[0]就是索引,反向索引,头部是-1,my[1][1],嵌套列表使用, 列表常用操作, 函数一样,需引入
|
6月前
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
62 0
|
存储 JavaScript 前端开发
过滤掉数组中重复的元素
过滤掉数组中重复的元素
48 0
|
存储
返回集合中最大,最小的元素,再将元素进行排序
返回集合中最大,最小的元素,再将元素进行排序
59 0
|
算法 Python
一日一技:包含元组的列表,对第一个元素升序第二个元素降序
一日一技:包含元组的列表,对第一个元素升序第二个元素降序
99 0
|
API 索引
查询元素
查询元素
93 0