如果是一个包含数字的列表,我们要对它进行去重同时保持剩余数据的顺序,可以使用集合来实现:
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 jsoninfo = {'zel': 1, 'tel': 7384, 'name': 'kingname'}info_json = json.dumps(info, sort_keys=True)print(info_json)
运行效果如下图所示:
移除包含非 hashable
元素的列表,就可以使用JSON字符串来辅助去重:
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)
运行效果如下图所示: