需求:对下列数据按任意字段去重
需要达到的效果:
按照id进行去重,id重复则算重复。重复的取第一个数据。
按照name和tel去重,name和tel都重复则算重复。重复的取第一个数据。
样例:
个人信息数据data如下,名字、年龄、手机号相同,则认为是同一人,去除重复的人员信息,重复的仅保留第一条数据。
data = [{
"id": 1,
"name": "张三",
"age": 16,
"home": "北京",
"tel": "12345"
}, {
"id": 2,
"name": "李四",
"age": 16,
"home": "北京",
"tel": "123456"
}, {
"id": 3,
"name": "张三",
"age": 16,
"home": "北京",
"tel": "12345"
}]
去重功能代码实现:
def duplicate_removal(datas, condition, model="key"):
"""
:param datas: 准备去重的数据,格式[{},{}...]
:param condition: 去重参考的键值,需要数据里面有这些key
:param model: 去重模式,key模式为去重参考的key值;notkey模式为去重不参考的key值。相反关系。
:return: 去重后的数据,格式[{},{}...]
"""
def flags(keys, data):
tmp_dic = {}
for key in keys:
tmp_dic.update({key: data.get(key)})
return tmp_dic
removal_data = []
values = []
if datas:
if model == "key":
keys = condition
elif model == "notkey":
keys = [key for key in datas[0].keys() if key not in condition]
else:
raise ValueError("传入的model值错误,无法匹配")
for data in datas:
if flags(keys, data) not in values:
removal_data.append(data)
values.append(flags(keys, data))
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进行操作按照数据中的某个键值进行去重。