Сравнить два списка и вывести недостающие элементы (с сохранением количества)

Пытаюсь получить все элементы списка list_a, которых нет в списке list_b (с сохранением количества):

list_a = ['users1_', 'users1_', 'users2_', 'users3_']
list_b = ['users1_', 'users3_']
list_c = list()

for template in list_a:
    if template not in list_b:
        list_c.append(template)

print(list_c)  # ['users2_']

Но получаю только один элемент. Что требуется сделать, чтобы получить ['users1_', 'users2_'] ?

Что-то вроде:

print(list(set(list_a) ^ set(list_b)))

не подходит, поскольку мне важны все элементы списка. Здесь set не подходит, так как он оставит только уникальные элементы в списках.


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

Автор решения: gil9red

А так?

Разницу добавляем в list_b:

list_a = ['users1_', 'users1_', 'users2_', 'users3_']
list_b = ['users1_', 'users3_']
list_c = []

for x in list_a:
    num_a = list_a.count(x)
    num_b = list_b.count(x)
    if num_a > num_b:
        list_b.append(x)
        list_c.append(x)

print(list_c)  # ['users1_', 'users2_']
→ Ссылка
Автор решения: Эникейщик

Если элемент найден, то удалить из списка b:

for template in list_a:
    if template not in list_b:
        list_c.append(template)
    else:
        list_b.remove(template)
→ Ссылка
Автор решения: extrn

Если порядок элементов в результирующем списке не важен, зато важна производительность.

from collections import Counter

list_c = list((Counter(list_a) - Counter(list_b)).elements()) # ['users1_', 'users2_']
→ Ссылка