我在这里有一个字典和一个字符串,其中dict包含char-count作为键值对。我想检查字符串中的所有字符是否完全包含在dict中。
这意味着dict应该包含字符串的所有字符,其计数小于或等于字典中的相应值。
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
。
这是因为dict中没有e
。
这里的错误在哪里?如何检查dict中的所有对是否也存在于另一个dict中,可能具有相等或更低的相应值(键)。
答案 0 :(得分:1)
你的意思是
d[x]=d.get(x,0)
是
d[x]=d.get(x,0) + 1
否则,字典中的所有值都为0
,函数将始终返回True
(除非字符串为空或给定字典中的任何值为0
。
另请注意,第一次循环使用collections.Counter
会更容易:
d = collections.Counter(strng)
关于测试一个dict是否在另一个dict中的问题,你可以这样做:
all(k in dct and v < dct[k] for k, v in d.items())