Python: удаление подобных объектов из списка с помощью difflib.SequenceMatcher

голоса
43

Скажем , у меня есть список некоторых строк, и есть определенные строки , что там очень, очень похожи. И я хочу , чтобы удалить эти почти дубликаты . Для этого я придумал следующий код:

from difflib import SequenceMatcher

l = ['Apple', 'Appel', 'Aple', 'Mango']
c = [l[0]]

for i in l:
    count = 0
    for j in c:
        if SequenceMatcher(None, i, j).ratio() < 0.7:
            count += 1
    if count == len(c):
        c.append(i)

Который, кажется, работает нормально, но я не очень люблю вложенные циклы, а также это count решение выглядит некрасиво. Но , наверное , это можно записать его в более вещий образом? Использование генераторов, может быть?

Был бы признателен за подсказку, спасибо :)

Задан 14/12/2017 в 16:09
пользователем
На других языках...                            


1 ответов

голоса
1

Я думаю , что уборщик способ , чтобы написать это было бы использовать difflibметодget_close_matches

from difflib import get_close_matches

l = ['Apple', 'Appel', 'Aple', 'Mango']
c = []

while l:
    word = l.pop()
    c.append(word)
    l = [x for x in l if x not in get_close_matches(word, l, cutoff=0.7)]

Обратите внимание , что это вскрывает lтак что вы можете сделать копию первой.

Ответил 14/12/2017 в 16:46
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more