2D "массив" или объектный питон для фильтрации дубликатов - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь отфильтровать дубликаты пользователей из базы данных.Там есть уникальный user_id и полное имя.Я сравниваю имена, используя difflib.get_close_matches

Теперь, когда имена не уникальны, я создал словарь с user_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

В конце мне нужно найти 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

1 Ответ

0 голосов
/ 26 сентября 2018

Мне кажется, что вы действительно хотите перейти от имени к идентификатору, а не наоборот.Чтобы решить проблему с полными именами, которые не обязательно должны быть уникальными, нужно создать список 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(): ключ - полное имя, значение - список потенциально повторяющихся полных имен.Из вашего вопроса следует, что вы уже знаете, как это сделать.

Прокрутите ваш диктат о близких совпадениях и сообщите полное имя и идентификатор:

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() позвоните сюда для простоты, но вы почти наверняка захотите собрать результаты в список для дальнейшей обработки.

...