Сравните словарный ключ со всеми другими ключами в том же словаре - PullRequest
0 голосов
/ 16 января 2020

У меня есть словарь с именами авторов в качестве ключей и значениями None. Я хочу использовать fuzzywuzzy для сравнения имен этих авторов, чтобы увидеть, есть ли похожие, которые я могу объединить.

До сих пор я использую два словаря (они имеют одинаковые данные в обоих), а затем использую двойной for л oop. Я хочу оптимизировать его дальше, и я думал об использовании словаря, но я не мог понять, как добиться этого с моей нечеткой сравнительной логикой c.

Мой код ниже, где два словаря идентичны.

Пример словаря:

{'Trevor Jacobs': None, 'Josh Francis': None, 'Marcie Lank': None, 'Marcie H. Lank': None}
import uuid
from fuzzywuzzy import fuzz

authorToDelete = {}
dictOfAllData1 = {'Trevor Jacobs': None, 'Josh Francis': None, 'Marcie Lank': None, 'Marcie H. Lank': None}
dictOfAllData2 = {'Trevor Jacobs': None, 'Josh Francis': None, 'Marcie Lank': None, 'Marcie H. Lank': None}

for key in dictOfAllData1:
    for key2 in dictOfAllData2:
        str1 = ' '.join(key.split()) #some spaces are different so I handle those here
        str2 = ' '.join(key2.split())
        ratio = fuzz.ratio(str1, str2)
        if fuzz.ratio(str1, str2) > 85 and dictOfAllData1[key] == None:
            dictOfAllData1[key] = uuid.uuid1()
        elif ratio > 85:
            if str1 != str2:
                authorToDelete[key2] = None
            else:
                dictOfAllData1[key] = uuid.uuid1()

for deleteMe in authorToDelete:
    dictOfAllData1.pop(deleteMe)

Это код, который у меня есть до сих пор. Это работает, но это занимает больше времени, чем я думаю (около 4 секунд со словарем из ~ 700 ключей)

Мой вопрос: как я могу сделать это более эффективным? Есть ли способ, которым я могу использовать if in dict или что-то в этом роде вместо моего второго for l oop?

Редактировать: я воспользовался советом в комментариях ниже и также опубликовал его в Code Review. Я буду обновлять, если я найду ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...