首页 > 编程语言 >Python实现列表中嵌套字典按照给定key值去重

Python实现列表中嵌套字典按照给定key值去重

时间:2022-09-30 09:45:20浏览次数:66  
标签:tel name Python 值去 key home data id

需求:对下列数据按任意字段去重

需要达到的效果:

按照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进行操作按照数据中的某个键值进行去重。

标签:tel,name,Python,值去,key,home,data,id
From: https://www.cnblogs.com/yrdy/p/16743841.html

相关文章