Python: usuwanie podobnych obiektów z listy za pomocą difflib.SequenceMatcher

głosy
43

Powiedzmy mam listę niektórych ciągów i istnieją pewne ciągi tam, że bardzo, bardzo podobne. I chcę, aby usunąć te prawie duplikatów . Za to, wpadłem na następujący kod:

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)

Który wydaje się działać dobrze, ale ja nie lubię zagnieżdżonych pętli, a także to countrozwiązanie wygląda brzydko. Ale prawdopodobnie jest to możliwe, aby go zapisać w sposób bardziej pythonic sposób? Korzystanie z generatorów, może być?

Byłbym wdzięczny za podpowiedź, dzięki :)

Utwórz 14/12/2017 o 16:09
użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Myślę czystszy sposób napisać to byłoby użyć difflibmetodyget_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)]

Zauważ, że ten dekonstruuje lwięc może warto zrobić kopię tego pierwszego.

Odpowiedział 14/12/2017 o 16:46
źródło użytkownik

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