Я пытаюсь найти строки в двух списках, которые почти совпадают. Предположим, есть два списка, как показано ниже
string_list_1 = ['apple_from_2018','samsung_from_2017','htc_from_2015','nokia_from_2010','moto_from_2019','lenovo_decommision_2017']
string_list_2 =
['apple_from_2020','samsung_from_2021','htc_from_2015','lenovo_decommision_2017']
Output
Similar = ['apple_from_2018','samsung_from_2017','htc_from_2015','lenovo_decommision_2017']
Not Similar =['nokia_from_2010','moto_from_2019']
Я пробовал выше, используя реализацию ниже, но это не дает должного результата.
similar = []
not_similar = []
for item1 in string_list_1:
for item2 in string_list_2:
if SequenceMatcher(a=item1,b=item2).ratio() > 0.90:
similar.append(item1)
else:
not_similar.append(item1)
Когда я попробовал реализацию выше, это не так, как ожидалось. Было бы признательно, если бы кто-то мог определить недостающую часть и получить требуемый результат.
@TanishqVyas Да, мне нужен почти аналогичный, строка должна совпадать на 90%
Приведенный выше код работает нормально, так как большинство из них не совпадают 90% совпадений
Вы хотите исключить часть года при сопоставлении, тогда это возможно.
Отвечает ли это на ваш вопрос? Как найти пересечение списка?
Вы можете использовать следующую функцию, чтобы найти сходство между двумя заданными строками.
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
print(similar("apple_from_2018", "apple_from_2020"))
Выход :
0.8666666666666667
Таким образом, используя эту функцию, вы можете выбрать строки, которые пересекают пороговое значение процентного сходства. Хотя вам может потребоваться уменьшить порог с 90 до 85, чтобы получить ожидаемый результат.
Таким образом, следующий код должен работать нормально для вас
string_list_1 = ['apple_from_2018','samsung_from_2017','htc_from_2015','nokia_from_2010','moto_from_2019','lenovo_decommision_2017']
string_list_2 = ['apple_from_2020','samsung_from_2021','htc_from_2015','lenovo_decommision_2017']
from difflib import SequenceMatcher
similar = []
not_similar = []
for item1 in string_list_1:
# Set the state as false
found = False
for item2 in string_list_2:
if SequenceMatcher(None, a=item1,b=item2).ratio() > 0.80:
similar.append(item1)
found = True
break
if not found:
not_similar.append(item1)
print("Similar : ", similar)
print("Not Similar : ", not_similar)
Выход :
Similar : ['apple_from_2018', 'samsung_from_2017', 'htc_from_2015', 'lenovo_decommision_2017']
Not Similar : ['nokia_from_2010', 'moto_from_2019']
Это сокращает количество времени и избыточных добавлений. Также я уменьшил меру сходства до 80, так как 90 было слишком много. Но не стесняйтесь изменять значения.
Могу ли я узнать, возможно ли избежать вложенного цикла с лучшим форматом кодирования
Просто пояснение: вы хотите выбрать все строки из списка строк 1 так, чтобы они на 90% или более совпадали с любой из строк в списке 2, верна ли эта интерпретация?
Да Танюша. Но можно ли улучшить формат кодирования
Вы должны использовать вложенные циклы, так как вы должны проверить все возможные пары, которые могут удовлетворить ваше условие. Таким образом, вы должны перебрать их все. Однако вы можете использовать ключевое слово continue для переключения на следующий цикл после того, как будет найден элемент совпадения. Кроме того, код, который вы указали выше, многократно добавляет несоответствующее слово несколько раз, если сходство меньше 0,9. Таким образом, вы должны правильно разорвать циклы, чтобы сократить время, затрачиваемое на решение, и улучшить его. Но вложенность обязательна. Это Танишк* :)
Вы хотите найти похожие термины и разные термины между двумя списками строк?