Как правильно подсчитать совпадающие элементы в двух списках?

У меня есть два списка

list_1 = [['появление', 'NOUN'], ['ООН', 'PROPN'], ['было', 'AUX'], ['обусловлено', 'VERB'], ['целым', 'ADJ'], ['рядом', 'NOUN'], ['объективных', 'ADJ'], ['факторов', 'NOUN'], ['военно', 'ADJ'], ['стратегического', 'ADJ'], ['политического', 'ADJ'], ['экономического', 'ADJ'], ['развития', 'NOUN'], ['человеческого', 'ADJ'], ['общества', 'NOUN'], ['конца', 'NOUN'], ['второго', 'NUM'], ['тысячелетия', 'NOUN'], ['создание', 'NOUN'], ['ООН', 'NOUN'], ['явилось', 'VERB'], ['воплощением', 'NOUN'], ['извечной', 'ADJ'], ['мечты', 'NOUN'], ['человечества', 'NOUN'], ['о', 'ADP'], ['таком', 'PRON'], ['устройстве', 'NOUN'], ['и', 'CCONJ'], ['организации', 'NOUN'], ['международного', 'ADJ'], ['общежития', 'NOUN'], ['которые', 'PRON'], ['избавили', 'VERB'], ['бы', 'x'], ['человечество', 'NOUN'], ['от', 'ADP'], ['бесконечности', 'NOUN'], ['череды', 'NOUN'], ['войн', 'NOUN'], ['и', 'CCONJ'], ['обеспечили', 'VERB'], ['бы', 'x'], ['мирные', 'ADJ'], ['условия', 'NOUN'], ['жизни', 'NOUN'], ['народов', 'NOUN'], ['их', 'PRON'], ['поступательное', 'ADJ']]
list_2 = [['появление', 'NOUN'], ['ООН', 'NOUN'], ['было', 'VERB'], ['обусловлено', 'VERB'], ['целым', 'ADJ'], ['рядом', 'NOUN'], ['объективных', 'ADJ'], ['факторов', 'NOUN'], ['военно', 'ADJ'], ['стратегического', 'ADJ'], ['политического', 'ADJ'], ['экономического', 'ADJ'], ['развития', 'NOUN'], ['человеческого', 'ADJ'], ['общества', 'NOUN'], ['конца', 'NOUN'], ['второго', 'NUM'], ['тысячелетия', 'NOUN'], ['создание', 'NOUN'], ['ООН', 'PROPN'], ['явилось', 'VERB'], ['воплощением', 'NOUN'], ['извечной', 'ADJ'], ['мечты', 'NOUN'], ['человечества', 'NOUN'], ['о', 'ADP'], ['таком', 'DET'], ['устройстве', 'NOUN'], ['и', 'CCONJ'], ['организации', 'NOUN'], ['международного', 'ADJ'], ['общежития', 'NOUN'], ['которые', 'PRON'], ['избавили', 'VERB'], ['бы', 'x'], ['человечество', 'NOUN'], ['от', 'ADP'], ['бесконечности', 'NOUN'], ['череды', 'NOUN'], ['войн', 'NOUN'], ['и', 'CCONJ'], ['обеспечили', 'VERB'], ['бы', 'x'], ['мирные', 'ADJ'], ['условия', 'NOUN'], ['жизни', 'NOUN'], ['народов', 'NOUN'], ['их', 'PRON'], ['поступательное', 'ADJ']]

Я хочу сравнить два списка и подсчитать сколько элементов совпадает. мой код:

result22 = []
for c in list_1:
    for x in list_2:
        if c == x:
            result22.append(c)
        else:
            break
print(len(result22))

У меня выходит ответ 1, но должно получиться около 45. Подскажите, пожалуйста, где ошибка?


Ответы (4 шт):

Автор решения: Эникейщик

У вас если первый элемент второго списка не равен текущему элементу первого списка, то дальнейшее сравнение не производится. Нужно убрать else.

if c == x:
    result22.append(c)
    break
→ Ссылка
Автор решения: zaborschicov

Ошибка заключается в условии else, которое вызывает оператор break. В таком случае при первом же неравенстве двух элементов вы просто выходите из списка. Что бы всё работало вам просто надо убрать ветку else.

Важно заметить! В случае, если у вас есть несколько одинаковых элементов в списке они будут почитаны большее кол-во раз, чем они там упоминаются

→ Ссылка
Автор решения: SergFSM

если установлен pandas то вот такое слегка громоздкое выражение вернет нужный результат:

import pandas as pd

print(pd.Series(map(' '.join,list_1)).isin(list(map(' '.join,list_2))).sum())  # 47

а если так, то повторы считаться не будут:

print(pd.Series(map(' '.join,list_1)).drop_duplicates()
     .isin(list(map(' '.join,list_2))).sum())  # 45
→ Ссылка
Автор решения: older

Подскажите, пожалуйста, где ошибка?

Ты сравниваешь элементы, а надо проверять вхождение элемента в список

sum(e in list_2 for e in list_1)
→ Ссылка