二维“数组”或对象python,用于过滤重复项

时间:2018-09-26 08:02:10

标签: python dictionary scripting data-management

我正在尝试从数据库中过滤用户重复项。有一个唯一的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

1 个答案:

答案 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()调用,但是您几乎可以肯定希望将结果组合到列表中以进行进一步处理。