0

我在这里有一个 dict 和一个字符串,其中 dict 包含 char-count 作为键值对。我想检查字符串中的所有字符是否完全包含在字典中。

这意味着字典应该包含字符串的所有字符,它们的计数小于或等于它们在字典中的对应值。

def isValidWord(strng, dct):
    """
    Returns True if strng is entirely
    composed of letters in the dct.
    Otherwise, returns False.

    Does not mutate hand or dct.
    """

    d={}
    for x in strng:
        d[x]=d.get(x,0)

    for x in d:
        if d[x]> dct.get(x,0):
            return False

    return True

在大多数情况下它似乎工作得很好,但在某些情况下却不行。例如 -

isValidWord('chayote', {'a': 1, 'c': 2, 'u': 2, 't': 2, 'y': 1, 'h': 1, 'z': 1, 
'o': 2})

这给出了输出True,但是正确的输出是False. 这是因为e字典中没有。

这里的错误在哪里?以及如何检查一个字典中的所有对是否也存在于另一个字典中,可能具有相等或较低的对应值(键)。

4

1 回答 1

1

你是为了这条线

d[x]=d.get(x,0)

成为

d[x]=d.get(x,0) + 1

否则,字典中的所有值都将为0,并且函数将始终返回True(除非字符串为空或给定字典中的任何值都是0.

另请注意,它会更容易collections.Counter用于您的第一个循环:

d = collections.Counter(strng)

至于您测试一个字典是否在另一个字典中的问题,您可以这样做:

all(k in dct and v < dct[k] for k, v in d.items())
于 2013-03-10T05:40:40.053 回答