0

たとえば、私は持っています

x = "dsjcosnag"
y = "dog"

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

したがって、y の各文字のカウンターとして while ループを使用する必要があると思います。次に、itetools を使用して x のそれぞれを循環させることができます。それを削除してから、o の次の文字をチェックします。

これを行うより簡単な方法はありますか?

4

2 に答える 2

8

を使用しておよびマルチセットにcollections.Counter()変換し、減算して のすべての文字が で見つかるかどうかを確認します。xyyx

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
于 2013-03-29T14:47:49.810 に答える
1

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'))
于 2013-03-30T23:22:55.477 に答える