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

运行效果如下图所示:


目录
相关文章
|
1月前
|
算法 前端开发 索引
过滤数组中的元素
过滤数组中的元素
30 0
|
1月前
|
搜索推荐 算法 Python
如何实现归并排序算法? 要求:编写一个Python函数,输入一个无序列表,返回排序后的列表。
如何实现归并排序算法? 要求:编写一个Python函数,输入一个无序列表,返回排序后的列表。
|
1月前
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
38 0
|
8月前
|
存储 JavaScript 前端开发
过滤掉数组中重复的元素
过滤掉数组中重复的元素
27 0
|
存储
返回集合中最大,最小的元素,再将元素进行排序
返回集合中最大,最小的元素,再将元素进行排序
50 0
|
算法 Python
一日一技:包含元组的列表,对第一个元素升序第二个元素降序
一日一技:包含元组的列表,对第一个元素升序第二个元素降序
84 0
|
API 索引
查询元素
查询元素
80 0
|
索引
按顺序遍历表
按顺序遍历表
107 0
|
前端开发
CSS列表(有序,无序,去掉无序列表的点,列表一行显示)
CSS列表(有序,无序,去掉无序列表的点,列表一行显示)
CSS列表(有序,无序,去掉无序列表的点,列表一行显示)
定义一个方法,功能是找出一个数组中第一个只重复出现2次的元素,没有则返回null。例如:数组元素为 [1,3,4,2,6,3,4,2,3],重复两次的元素为4和2,但是元素4排在2的前面,则结果返回
定义一个方法,功能是找出一个数组中第一个只重复出现2次的元素,没有则返回null。例如:数组元素为 [1,3,4,2,6,3,4,2,3],重复两次的元素为4和2,但是元素4排在2的前面,则结果返回
116 0