Очень быстрый бинпоиск... или не очень? А есть быстрее?

Sigor

Новичок
Пользователь
Июн 3, 2023
2
0
1
Win10. Python 3.7
Потребовался быстренький подсчёт количества элементов списка 2 в списке 1
Пробовал 3 варианта:
Код:
for i in list2:
    print(list1.count(i))
- понятно, что самый понятный и надёжный, но и самый медленный...
Попробовал считать не в списке а в кортеже - тоже не очень...
Тогда бинпоиск:
Код:
for i in list2:
        count = 0
        E = 1
        while E != 0:
                L, R = -1, len(list1)
                while R - L > 1:
                        mid = (L + R) // 2
                        if list1[mid] <= i:
                                L = mid
                        else:
                                R = mid
                if list1[L] == i:
                    count += 1
                    list1.remove(list1[L])
                else:
                    E = 0
        print(count)
Всё равно медленно (и корявенько...).
Есть что-то быстрее бинпоиска или неправильно его применяю?
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
372
107
43
Может так?

Python:
count = len(set(list1).intersection(set(list2)))
print(count)
 

Sigor

Новичок
Пользователь
Июн 3, 2023
2
0
1
Спасибо большое за ответ! Но, наверное, я недостаточно развёрнуто представил вопрос (mea culpa)... - Нужно получить не просто количество совпадений элементов списка 2 в списке 1, а количество ПОВТОРЕНИЙ элементов списка 2 в списке 1.
Например:
list1 = [5, 5, 6, 7, 7, 7, 7]
list2 = [6, 7, 5, 8]
Ответ:
1
4
2
0

Списки большие, поэтому поиск недопустимо затягивается по времени...
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
372
107
43
Вот когда есть пример, гораздо проще:). Могу предложить такой вариант

Python:
from collections import Counter

counter1 = Counter(list1)
counter2 = Counter(list2)
counts = {k: counter1[k] for k in counter2}

for element, count in counts.items():
    print(f"Элемент {element} из list2 повторяется {count} раз(а) в list1.")
 

Форум IT Специалистов