0

こんにちは、私はプログラミングの方法を学び始めたばかりで、Python で記述する必要がある関数を持っています。これがその背後にある考え方です。

が手札にあり、完全に文字で構成されているTrue場合wordは返されます。wordListそれ以外の場合は、 を返しますFalse。hand または wordList を変更しません。

ユーザーが思いついた単語の文字の頻度をチェックする呼び出し関数があり、それは dict に変換されます。イテアイテムをさまざまな方法で使用しようとしましたが、役に立ちませんでした。ユーザーの手でその文字のエントリが 2 つない場合、それらは true として返されます。

これが不明確である場合は申し訳ありませんが、私は2週間前に始めたばかりです. どんなポインタでも素晴らしいでしょう私はこれに長い間立ち往生しています!

def isValidWord(hand,word,wordList):

    """
    Returns True if word is in the wordList and is entirely

    composed of letters in the hand. Otherwise, returns False.

    Does not mutate hand or wordList.

    word: string
    hand: dictionary (string -> int)
    wordList: list of lowercase strings
    """

    wordC = getFrequencyDict(word)
    handC = dict.copy(hand)
    if word not in wordList:
        return False
    for c in word:
        if c not in hand:
            return False
        for k,v in wordC.iteritems():
            if k in hand and v > 1:
                 handC[k] -= 1

基本的に私の次のステップは、word と handC を修正値で比較し、値がゼロのキーを割り引く方法を見つけようとすることでした。うまくいくと思います(希望)。

4

4 に答える 4

1

このようなものはどうですか:

def isValidWord(hand, word, word_list):
    if word not in word_list:
        return False
    for c in word:
        if c not in hand:
            return False
    return True

文字列は反復可能であるため、文字ごとにチェックできます。

幸運を

于 2013-03-06T20:49:55.820 に答える
1

あなたのコードがなければ、あなたが何を望んでいるのか理解できるかどうか見てみましょう:handユーザーが の各文字のスクラブル タイルを持っているかのように、指定された単語が の文字を使用してつづることができるかどうかを確認しようとしていhandます。

個人的には、hand辞書をコピーしてから、コピーを変更できるようにします。このようなもの:

def is_valid_word(hand, word, wordlist):
    hand_cp = dict(hand)
    for letter in word:
        if hand_cp.get(letter):
            # The letter is in our hand, so "use it up".
            hand_cp[letter] = hand_cp[letter] - 1
        else:
            # The letter isn't in our hand, so the word isn't valid.
            return False

    # If we can make the word, now make sure it's a real word:
    # (If wordlist is long, you might want to sort it and do a real search)
    if word not in wordlist: 
        return False

    # We haven't found any reason to return False, so this is a valid word.
    return True
于 2013-03-06T20:56:39.533 に答える
0

PythonCounterクラスはあなたの友達です。これは、 Python2.7以降で実行できます。

from collections import Counter

def is_valid_word(hand, word, word_list):
    letter_leftover = Counter(hand)
    letter_leftover.subtract(Counter(word))
    return word in word_list and all(v >= 0 for v in letter_leftover.values())

それで:

>>> def test():
...     hand = "traipse"
...     word_list = ["all", "the", "words", "in", "English", 
                     "parts", "pines", "partiers"]
...     print is_valid_word(hand, "parts", word_list)
...     print is_valid_word(hand, "pines", word_list)
...     print is_valid_word(hand, "partiers", word_list)
... 
>>> test()
True
False
False
于 2013-03-06T21:43:28.267 に答える