Python实现列表中嵌套字典按照给定key值去重
需求:对下列数据按任意字段去重
需要达到的效果:
按照id进行去重,id重复则算重复。重复的取第一个数据。
按照name和tel去重,name和tel都重复则算重复。重复的取第一个数据。
样例:
个人信息数据data如下,名字、年龄、手机号相同,则认为是同一人,去除重复的人员信息,重复的仅保留第一条数据。
1 data = [{ 2 "id": 1, 3 "name": "张三", 4 "age": 16, 5 "home": "北京", 6 "tel": "12345" 7 }, { 8 "id": 2, 9 "name": "李四", 10 "age": 16, 11 "home": "北京", 12 "tel": "123456" 13 }, { 14 "id": 3, 15 "name": "张三", 16 "age": 16, 17 "home": "北京", 18 "tel": "12345" 19 }]
去重功能代码实现:
1 def duplicate_removal(datas, condition, model="key"): 2 """ 3 :param datas: 准备去重的数据,格式[{},{}...] 4 :param condition: 去重参考的键值,需要数据里面有这些key 5 :param model: 去重模式,key模式为去重参考的key值;notkey模式为去重不参考的key值。相反关系。 6 :return: 去重后的数据,格式[{},{}...] 7 """ 8 def flags(keys, data): 9 tmp_dic = {} 10 for key in keys: 11 tmp_dic.update({key: data.get(key)}) 12 return tmp_dic 13 14 removal_data = [] 15 values = [] 16 if datas: 17 if model == "key": 18 keys = condition 19 elif model == "notkey": 20 keys = [key for key in datas[0].keys() if key not in condition] 21 else: 22 raise ValueError("传入的model值错误,无法匹配") 23 for data in datas: 24 if flags(keys, data) not in values: 25 removal_data.append(data) 26 values.append(flags(keys, data)) 27 28 return removal_data
执行效果:
给出的数据有id、name、age、home、tel共5个字段。要通过name、age、tel进行去重,有以下两种方式:
方式一:采用key模式
key = ['name', 'age', 'tel'] print(duplicate_removal(data, key, model="key"))
输出结果如下:
[{'id': 1, 'name': '张三', 'age': 16, 'home': '北京', 'tel': '12345'}, {'id': 2, 'name': '李四', 'age': 16, 'home': '北京', 'tel': '123456'}]
方式二:采用notkey模式,则是不用id、home字段
not_key = ['id', 'home'] print(duplicate_removal(data, not_key, model="notkey"))
输出结果如下:
[{'id': 1, 'name': '张三', 'age': 16, 'home': '北京', 'tel': '12345'}, {'id': 2, 'name': '李四', 'age': 16, 'home': '北京', 'tel': '123456'}]
同理:可通过控制传入的key进行操作按照数据中的某个键值进行去重。