Как правильно подсчитать совпадающие элементы в двух списках?
У меня есть два списка
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
Ошибка заключается в условии else, которое вызывает оператор break. В таком случае при первом же неравенстве двух элементов вы просто выходите из списка. Что бы всё работало вам просто надо убрать ветку else.
Важно заметить! В случае, если у вас есть несколько одинаковых элементов в списке они будут почитаны большее кол-во раз, чем они там упоминаются
если установлен 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
Подскажите, пожалуйста, где ошибка?
Ты сравниваешь элементы, а надо проверять вхождение элемента в список
sum(e in list_2 for e in list_1)