检查字符串和字典中是否出现值

时间:2017-06-11 07:27:49

标签: python string dictionary key

作为一个更大问题的一部分,我必须编写一个函数来检查给定单词中的所有字母是否出现在名为 hand 的字典中(以及在单词列表中,但是我在这里省略了那个部分),并确保如果一个字母出现两次,例如,在单词中,它必须在字典中至少出现多次。这是我写的一个功能:

def is_valid_word(word, hand):
    for let in word:
        if let in hand.keys():
            if hand[let]>=word.count(let):
                return True
            else:
                return False

我也尝试过这种方式:

def is_valid_word(word, hand):
    for let in word:
        if let not in hand.keys():
            return False
        else:                                 #in another variation I merged 
            if hand[let]>=word.count(let):    # these two lines with _elif_
                return True
            else:
                return False

在其他类似的功能中,我没有专门写过 hand.keys(),但只是跟着

if let in/not in hand 

每次我都用

尝试这个功能
print is_valid_word("account", {"a":1, "c":1, "l":2, "n":1, "o":3, "r":2, "t":1, "y":1})
即使字母" c"它也会返回True。在单词中出现两次,但在词典中只出现一次(我也尝试过单词"破裂"用不同措辞的词典,但是我在这里给出的第二个例子处理它的方式'应该,不像其他人)。 任何想法该怎么做?

修改:这就是它在问题中解释的方式,希望它让它更容易理解:

"单词列表中有效单词;它完全由当前手中的字母组成。 实现is_valid_word函数。

def is_valid_word(word, hand, word_list):
"""Returns True if word is in the word_list and is entirely 
composed of letters in the hand. Otherwise, returns False.
Does not mutate hand or word_list.
word: string
hand: dictionary (string -> int)
word_list: list (string)
"""
# TO DO ... "

3 个答案:

答案 0 :(得分:0)

该函数返回word中第一个字母的结果 - 终止该函数。 for循环不会超过第一个字母。

修改该功能,使其仅在所有字母有效时才返回True。 (可以在第一封无效的信件上返回False。)

答案 1 :(得分:0)

如果我没有误解你想要检查一个单词的所有字母是否是dict的键,并且dict中的相关值大于单词中字母的出现时间。不幸的是,你的程序有一个明显的错误。只有在检查完第一个字母后才会终止循环。

修改后应该如下所示:

def is_valid_word(word, hand):
    for let in word:
        if let in hand and hand[let]>=word.count(let):
            continue
        else:
            return False
    return True

我希望它有所帮助。

答案 2 :(得分:0)

我会使用allcollections.Counter来直截了当。

>>> def is_valid_word(word, hand, word_list):
...     if word in word_list:
...         return all(letter_dict[letter] >= hand[letter] for letter in Counter(word) if letter in hand ) 
>>>     return False