我正在尝试从数据库中过滤用户重复项。有一个唯一的user_id和全名。我正在使用difflib.get_close_matches
现在,由于名称不是唯一的,我创建了一个字典,其中user_id为键,名称为相关对象。但是比较这样的名称每次都需要遍历整个词典,访问这些名称有点麻烦。
我当时正在考虑只使用2D数组(列表),因为这样可以更快地获取数据,但是我真的不想使用索引(恕我直言,这是处理问题的非常难看的方法)。 高度赞赏有关如何以一种优雅的方式解决此问题的任何建议。 我还在学习python btw。
编辑: 数据集如下所示:
user_id name 4050 John Doe 4059 John doe 4052 John Doe1 9083 Napoleon Bonnaparte 7842 Mad Max 4085 Johnn Doe 4084 Alice Spring 5673 Fredy Krüger 4092 Alice Spring1 4042 Alice k Spring 4122 Max miller
最后,我需要找到相似名称的user_id,这就是为什么我使用difflib.get_close_matches
的原因,因此列表的结尾应如下所示:
user_id name 4050 John Doe 4059 John doe 4052 John Doe1 4085 Johnn Doe 4084 Alice Spring 4092 Alice Spring1 4042 Alice k Spring
答案 0 :(得分:0)
在我看来,您真的想从名称转到id,而不是相反。解决全名不一定唯一的问题的方法是针对每个全名列出一个user_id。因此,将具有user_id作为键且名称作为相关对象的字典反向。像这样:
from collections import defaultdict
lookup = defaultdict(list)
for id, name in mydict.items():
lookup[name].append(id)
现在使用difflib.get_close_matches()
构建紧密匹配的字典:key是全名,value是可能重复的全名的列表。从您的问题来看,您已经知道该怎么做。
仔细检查您的近况并报告全名和ID:
for name, duplicate_list in close_matches.items():
for id in lookup[name]:
print (id, name)
for duplicate in duplicate_list:
for id in lookup[duplicate]:
if duplicate != name:
print(id, duplicate, "possible duplicate of", name)
为简单起见,我在此处进行了print()
调用,但是您几乎可以肯定希望将结果组合到列表中以进行进一步处理。