Python: ștergerea obiecte similare dintr-o listă utilizând difflib.SequenceMatcher

voturi
43

Să presupunem că am o listă a unor siruri de caractere, și există anumite siruri de acolo , care foarte, foarte asemănătoare. Și vreau să șterg acele aproape duplicate . Pentru asta, am venit cu următorul cod:

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)

Ceea ce pare să funcționeze bine , dar eu nu place foarte mult bucle imbricate și , de asemenea , această countsoluție pare urât. Dar , probabil , este posibil să - l scrie în jos într - un mod mai pythonic? Folosind generatoare, ar putea fi?

Ar fi recunoscător pentru un indiciu, multumesc :)

Întrebat 14/12/2017 la 16:09
de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
1

Cred că un mod mai curat pentru a scrie acest lucru ar fi de a utiliza difflibmetodaget_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)]

Rețineți că această deconstruiește lastfel încât s -ar putea dori să facă o copie a acesteia în primul rând.

Publicat 14/12/2017 la 16:46
sursa de către utilizator

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