用于过滤重复项的 2D "array" 或对象 python

2D "array" or object python for filtering duplicates

我正在尝试从数据库中过滤用户重复项。有一个唯一的 user_id 和全名。我正在使用 difflib.get_close_matches

比较名称

现在,由于名称不是唯一的,我创建了一个字典,其中 user_id 作为键,名称作为相关对象。但是像这样比较名称需要每次都遍历整个字典并且访问名称是一种痛苦。

我正在考虑只使用二维数组(列表),因为它可以更快地获取数据,但我真的不想使用索引(恕我直言,这是处理问题的一种非常丑陋的方法) . 非常感谢任何有关如何以优雅的方式解决此问题的建议。 我还在学习 python 顺便说一句。

编辑: 数据集如下所示:


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_ids,这就是我使用 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

在我看来,您确实想要从名称到 ID,而不是相反。解决全名不一定唯一的问题的方法是对每个全名都有一个 user_ids 的列表。因此,反转以 user_id 作为键并将名称作为相关对象的字典。像这样:

from collections import defaultdict
lookup = defaultdict(list)
for id, name in mydict.items():
    lookup[name].append(id)

现在使用 difflib.get_close_matches() 构建接近匹配项的字典:键是全名,值是可能重复的全名列表。从你的问题看来,你已经知道该怎么做了。

遍历你的近距离匹配字典并报告全名和 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() 调用,但您几乎肯定会希望 assemble 将结果放入列表中以供进一步处理。