たとえば、私は持っています
x = "dsjcosnag"
y = "dog"
print(checkYinX(y,x))
>>true
したがって、y の各文字のカウンターとして while ループを使用する必要があると思います。次に、itetools を使用して x のそれぞれを循環させることができます。それを削除してから、o の次の文字をチェックします。
これを行うより簡単な方法はありますか?
を使用しておよびマルチセットに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'))