2D";数组";或用于过滤重复项的对象python

2D";数组";或用于过滤重复项的对象python,python,dictionary,scripting,data-management,Python,Dictionary,Scripting,Data Management,我正在尝试从数据库中筛选重复的用户。有一个唯一的用户名和全名。我正在使用difflib.get\u close\u matches比较名称 现在,由于名称不是唯一的,我创建了一个字典,用户id作为键,名称作为相关对象。但是,像这样比较名称需要每次都遍历完整的字典,访问名称是一种痛苦。 我曾考虑只使用2d数组(列表),因为它可以更快地获取数据,但我并不真的想使用索引(我认为这是一种非常丑陋的处理问题的方法)。 任何关于如何优雅地解决这个问题的建议都将受到高度赞赏。 顺便说一句,我还在学习pyth

我正在尝试从数据库中筛选重复的用户。有一个唯一的用户名和全名。我正在使用
difflib.get\u close\u matches比较名称

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

我曾考虑只使用2d数组(列表),因为它可以更快地获取数据,但我并不真的想使用索引(我认为这是一种非常丑陋的处理问题的方法)。 任何关于如何优雅地解决这个问题的建议都将受到高度赞赏。 顺便说一句,我还在学习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
在我看来,你真的想从名字到身份证,而不是相反。解决全名不一定是唯一的问题的方法是在每个全名上都有一个用户ID列表。因此,将用户id作为键,名称作为相关对象的字典反转。像这样:

from collections import defaultdict
lookup = defaultdict(list)
for id, name in mydict.items():
    lookup[name].append(id)
现在使用
difflib.get\u close\u matches()
:key是全名,value是可能重复的全名列表,来构建一个dict的紧密匹配。从你的问题看来,你已经知道怎么做了

循环查看您的密切匹配记录,并报告全名和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()
调用,但您几乎肯定会希望将结果组合到一个列表中以供进一步处理。

听起来您可以将其加载到数据帧中,然后根据
用户id删除重复项。
?或者我误解了吗?您在不同的用户id下有重复的名称吗?如果你能举个例子就更好了,因为名字很难处理,所以不清楚到底什么是重复的,也不清楚确定重复的标准。这是我的第一篇帖子,对不起!按照你的建议延长,谢谢!现在也应该清楚,你确实误解了我的主要问题不是比较名称,因为difflib做得很好,我认为,只是以一种简单、优雅和可读的方式访问数据。谢谢你的回答。但这基本上是我想要避免的,很多嵌套循环和许多不同的列表需要检查和比较等等。但似乎没有优雅的方法来解决这些“问题”…您的数据是多对一对多的:一个名称可以有多个ID和多个模糊匹配。您希望将多个面上的属性连接在一起。这意味着3个循环和两组列表。这可能比你想要的要多,但我看不出如何在逻辑上减少它;如果我想使用get_close_matches,这就是你说的。这行中的姓名和id不应该互换吗
lookup[name].append(id)
@cawntown No,这就是撤销原始词典的全部意义。您希望从全名到模糊匹配(这也是一个全名,但不同)并从这里到id。因此,您的查找表需要从全名到id。而且,由于您可以(至少在原则上)有重复的全名,id不能是单个值,它需要是一个列表,以便您可以将所有ID与该全名关联。您选择id作为密钥是因为它是唯一的,但您希望从模糊匹配到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)