Как определить, содержит ли один список другой?

Вот, например, несколько списков:

>>> l1 = [2, 2, 3]
>>> l2 = [2, 2]
>>> l3 = [3, 2]
>>> l4 = [2, 2, 2]
>>> l5 = [2, 5, 2]

Как определить, входит ли l1 в l2, если в списках есть дубликаты и порядок элементов не важен? Рассматриваем решение с использованием collections.Counter.

При условии, что списки могут содержать дубликаты и порядок элементов не важен, нужно реализовать функцию проверки is_superset, работающую следующим образом:

>>> is_superset(l1, l2)
True
>>> is_superset(l1, l3)
True
>>> is_superset(l1, l4)
False
>>> is_superset(l1, l5)
False

Если бы не было дубликатов или дубликаты не были важны (т. е. l1 и l3 были бы надмножествами друг друга), можно было бы использовать логику типа set. Но поскольку l1 может быть надмножеством l3, нужно рассматривать мультимножества. В collections.Counter уже есть реализация:

from collections import Counter
def is_superset(a, b):
    return not Counter(b) - Counter(a)

Обратите внимание, что так рассчитывается правильная разность между мультимножествами (точно так же, как и правильная разность между обычными множествами), а не поэлементная разность через словари. Итак, если вы вычтите мильтимножество, то получите пустое мультимножество (то есть булево значение Counter(), как и всех пустых коллекций в Python, будет False).

>>> is_superset(l1, l2)
True
>>> is_superset(l1, l3)
True
>>> is_superset(l1, l4)
False
>>> is_superset(l1, l5)
False
>>> is_superset(l3, l1)
False

Спасибо martineau.