如果是一个包含数字的列表,我们要对它进行去重同时保持剩余数据的顺序,可以使用集合来实现:
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.dumps
的 sort_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)
运行效果如下图所示: