Как проверить, что один кортеж содержит все элементы другого кортежа?

Этот вопрос, как и многие другие, не на выдумывание алгоритма перебора, а на знание и умение вовремя применить готовый метод. Не нужно ничего изобретать, не нужно танцевать вокруг элементов кортежа, пытаясь наиболее эффективно перебрать одно через другое.

Самый простой способ - использовать метод issubset:

small = (1,2,3)

big = (4, 5, 6, 7, 1, 2, 4, 4, 3)

set(small).issubset(set(big))

>>>True

Вот вам совет: как только вы замечаете, что заиграла музыка и вас вот-вот унесёт божественный танец - остановитесь и подумайте, вспомните, что "батарейки в комплекте". Просто нужно знать, где они лежат, достать и использовать по назначению.

Туда же:

all(x in big for x in small)

>>>True

Дополняем условие предыдущей задачи: нужно учитывать повторы, воспользуемся предложенным алгоритмом.

"Алгоритм для выяснения - имеет ли один кортеж все элементы другого, будет таким:

Берём кортеж с меньшей длиной, создаём словарь где ключи это элементы а значения это их повторения.

Затем обходим по кортежу с большей длинной и сокращаем значение повторов в созданном словаре по ключу если он есть в словаре. Если ключ имеет 0 повторов мы его удаляем из словаря.

Как итог, если больший имеет все элементы что и в меньшем кортеже. То словарь станет пустым после прохода по большему кортежу. Сложность будет O(M+N) по скорости. По памяти O(M)''

dict_small = {key:0 for key in small}

for key in small:

‧‧‧‧dict_small[key]+=1 # В результате словарь={значение:повторы}

for key in big:

‧‧‧‧if key in small:

‧‧‧‧‧‧‧‧dict_small[key]-=1

‧‧‧‧‧‧‧‧if not dict_small[key]: # Там ноль

‧‧‧‧‧‧‧‧‧‧‧‧del dict_small[key]

print(not dict_small) # True если пуст.

Вариант с двумя collections.Сounter (можно и с одним).

from collections import Counter

small = (1, 1, 2, 3)

big = (4, 5, 6, 7, 1, 2, 4, 4, 3, 1)

dict_small = Counter(small)

dict_big = Counter(big)

print(dict_small, dict_big)

# Самый простой вариант, можно и лучше

res = True

for key in dict_small:

‧‧‧‧if dict_big[key] >= dict_small[key]:

‧‧‧‧‧‧‧‧...

‧‧‧‧else:

‧‧‧‧‧‧‧‧res = False

print(res)

На этом, пожалуй, закончу с #25.

Это кросспост из моего Telegram-канала "Не Ван Россум", где я прямо сейчас пишу сериал "101 вопрос про Python" с описанием подводных камней, неочевидностей и загвоздок.