Как проверить, почти равны ли строки в двух списках, используя python

Я пытаюсь найти строки в двух списках, которые почти совпадают. Предположим, есть два списка, как показано ниже

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)
  

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

Вы хотите найти похожие термины и разные термины между двумя списками строк?

Tanishq Vyas 21.12.2020 07:44

@TanishqVyas Да, мне нужен почти аналогичный, строка должна совпадать на 90%

Aaditya R Krishnan 21.12.2020 07:46

Приведенный выше код работает нормально, так как большинство из них не совпадают 90% совпадений

Nitin Goyal 21.12.2020 07:49

Вы хотите исключить часть года при сопоставлении, тогда это возможно.

Nitin Goyal 21.12.2020 07:51

Отвечает ли это на ваш вопрос? Как найти пересечение списка?

dahiya_boy 21.12.2020 07:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
5
1 028
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать следующую функцию, чтобы найти сходство между двумя заданными строками.

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 было слишком много. Но не стесняйтесь изменять значения.

Могу ли я узнать, возможно ли избежать вложенного цикла с лучшим форматом кодирования

Aaditya R Krishnan 21.12.2020 07:54

Просто пояснение: вы хотите выбрать все строки из списка строк 1 так, чтобы они на 90% или более совпадали с любой из строк в списке 2, верна ли эта интерпретация?

Tanishq Vyas 21.12.2020 07:57

Да Танюша. Но можно ли улучшить формат кодирования

Aaditya R Krishnan 21.12.2020 07:59

Вы должны использовать вложенные циклы, так как вы должны проверить все возможные пары, которые могут удовлетворить ваше условие. Таким образом, вы должны перебрать их все. Однако вы можете использовать ключевое слово continue для переключения на следующий цикл после того, как будет найден элемент совпадения. Кроме того, код, который вы указали выше, многократно добавляет несоответствующее слово несколько раз, если сходство меньше 0,9. Таким образом, вы должны правильно разорвать циклы, чтобы сократить время, затрачиваемое на решение, и улучшить его. Но вложенность обязательна. Это Танишк* :)

Tanishq Vyas 21.12.2020 08:02

Другие вопросы по теме