Как искать в строке, чтобы узнать, могу ли я написать слово

Например, у меня есть

x = "dsjcosnag"
y = "dog"

print(checkYinX(y,x))
>>true

Поэтому я думаю, что мне нужно было бы использовать цикл while в качестве счетчика для каждой буквы в y, а затем я мог бы использовать itetools для циклического перебора каждого из x, каждого цикла. Он проверял бы, если x == y, если он если он уберет его, то проверьте следующую букву в o.

Есть ли более простой способ сделать это?

2 ответа

Решение

Использование collections.Counter() преобразовать x а также y на несколько множеств, затем вычтите, чтобы увидеть, все ли y письма можно найти в x:

from collections import Counter

def checkYinX(y, x):
    return not (Counter(y) - Counter(x))

Вычитание нескольких множеств удаляет символы, когда их количество падает до 0. Если это приводит к пустому множеству, оно становится False в логическом контексте, как и все "пустые" типы Python. not превращает это в True если это так.

Демо-версия:

>>> x = "dsjcosnag"
>>> y = "dog"
>>> print(checkYinX(y,x))
True
>>> print(checkYinX('cat',x))
False

Вот способ сделать это без collections.CounterПо запросу в чате:

def countLetters(word):
    d = {}
    for l in word:
        d[l] = d.get(l,0) + 1
    return d

def checkSubset(answer,letters):
    a, l = countLetters(answer), countLetters(letters)
    return all(l.get(x,0) >= a.get(x) for x in a.keys())

print(checkSubset('dog','odr'))
Другие вопросы по тегам