Если мы посмотрим на all(q in [4,5] for q in the_list_name)
, то есть только половину этого if, мы увидим, что он возвращает False
для всех списков. Этот оператор фактически проверяет, равны ли все элементы в списке 4 или 5. То же самое для другого, он проверяет, все ли элементы равны 3 или 4, поэтому имеет смысл, чтобы все они были False
.
Чтобы правильно проверить, содержит ли список 4 и 5, но не содержит 3 ИЛИ 4, вы можете изменить свой код на:
inc = [4, 5]
exc = [2, 3]
testList = lambda l, inc, exc: all(i in l for i in inc) and not any(e in exc for e in l)
, получив результаты:
>>> testList(list1, [4, 5], [2, 3])
False
>>> testList(list2, [4, 5], [2, 3])
False
>>> testList(list3, [4, 5], [2, 3])
True
При внимательном рассмотрении:
all(i in l for i in inc)
: все элементы из c (элементы, которые необходимо включить) являются частью данного списка l not any(e in exc for e in l)
: для каждого элемента в данном списке l, ни один из них не должен быть в списке ex c (элементы, которые необходимо исключить)
Изменить:
Если вы хотите использовать ответы @ekhumoro из комментариев (что более элегантно), но также имеете параметры для элементов, которые необходимо включить / исключить, вы можете использовать:
testList = lambda l, i, e: {*i}.issubset(l) and not {*e}.intersection(l)