Удалить похожие (но не одинаковые) строки в одном списке - PullRequest
0 голосов
/ 04 марта 2020

У меня есть список строк, которые выглядят так:

my_list = ['https://www.google.com/', 'http://www.google.com/', 
           'https://www.google.com',  'http://www.google.com']

Как вы можете видеть, они не одинаковы, но все они очень похожи.

У меня также есть функция, которая это:

from fuzzywuzzy import fuzz

def similar(a, b):
    return fuzz.ratio(a,b)

Я хочу использовать эти функции и сказать что-то вроде:

for a,b in my_list:
    print (a,b)
    if similar(a,b) > 0.95:
        my_list.remove(b)

Поэтому я пытаюсь удалить похожие строки поиска из списка, если они выше определенного коэффициент сходства. Я хочу сделать это так, чтобы в этом списке у меня был только первый URL, в этом случае my_list будет иметь вид:

my_list = ['https://www.google.com/']

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Как правило, вы никогда не должны использовать list.remove() в итерации l oop, потому что итератор списка будет сбит с толку, когда вы удаляете элемент из того же списка, который вы перебираете.

И поскольку вы всегда хотите сохранить первый элемент, который вы можете исключить из альтернативного решения l oop:

idx = 1
while idx < len(my_list):
    if similar(my_list[idx - 1], my_list[idx]) > 0.95:
        my_list.remove(my_list[idx])

print(my_list)

со списком

first_item = my_list[0]
my_list = [first_item] + [item for item in my_list[1:] if similar(first_item, item) <= 0.95]

print(my_list)
0 голосов
/ 04 марта 2020

После некоторого поиска в Google, я обнаружил, что у fuzzywuzzy есть встроенная функция, которая довольно хороша.

from fuzzywuzzy.process import dedupe

deduped_list = list(dedupe(my_list, threshold=97, scorer=fuzz.ratio))
...