簡體   English   中英

使用Python搜索帶有空白圖塊的拼字游戲中的單詞列表

[英]Searching list of words in scrabble with blank tile using Python

我有一個拼字游戲挑戰,下面列出了信件:

letters = ['t', 'u', 'v', 'w', 'x', 'y', 'z']

以及以下單詞列表:

word = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra']

這是我用來查找可用於給定字母列表的單詞的代碼

def valid_word(word, letters):
    available_letters = letters[:]

    candidate = True

    for letter in word:
        if letter not in available_letters:     
            candidate = False
        else:
            available_letters.remove(letter)
    if candidate == True:
        return candidate

它給我的輸出是,對於當前的字母列表,可以使用兩個單詞“ yutz”和“ tux ”。

我的挑戰是,如果我們將字母 列表中的字母之一替換為列表中表示為'_'空白,該怎么辦。 例如,以下將't'替換為'_'

letters = ['_', 'u', 'v', 'w', 'x', 'y', 'z']

代碼如何仍然能夠找到相同的單詞“ yutz”和“ tux”,但替換掉丟失的字母? 預期的輸出是“ yu_z”和“ _ux”。

更新:

這是我嘗試過的代碼,它無法完全正常工作,但可以為我的前進方向指明方向:

rack_list = []
    for letter in letters:
        if letter in string.ascii_lowercase:
            rack_list.append(letter)
        else:
            blank_count = user_input.count("_")

    def valid_word(word, rack):
    available_letters = rack_list[:]
    missed_counter = 0

    for letter in word:
        if letter in available_letters:     
            available_letters.remove(letter)
        else:
            missed_counter += 1
    if missed_counter <= blank_count:
        for i in word:
            if i in available_letters:
                word += i
            else:
                word += "_"
        return word

而不是簡單地將candidate設置為False ,而是要保留錯過了多少個字母的計數器。 當該數量超過機架中的空白數量時, 取消該單詞的資格。

另外,請注意, if candidate == True為多余。 簡單地使用if candidate 該值已經是布爾值; 無需測試。


每次OP添加嘗試的代碼更改:

您的主要問題是要在循環中放入最終印刷品。 直到您檢查完所有字母(完成循環),您才知道該單詞是否可行。

def valid_word(word, rack):
    available_letters = rack[:]
    blank_count = available_letters.count('_')
    # print available_letters, blank_count

    missed_counter = 0
    for letter in word:
        if letter in available_letters:         
            available_letters.remove(letter)
        else:
            missed_counter += 1

    # print word, missed_counter
    if missed_counter <= blank_count:
        print(word)


# Test program
rack = ['_', 'u', 'v', 'w', 'x', 'y', 'z']
lexicon = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'xyzzy', 'zebra']

for word in lexicon: 
    valid_word(word, rack)

輸出:

yutz
tux
In [1]: def valid_word(word, rack_list):
 ...:     wrd = [w for w in word]
 ...:     for l in rack_list:
 ...:         try:
 ...:             wrd.remove(l)
 ...:         except:
 ...:             pass
 ...:     return len(wrd) <= ll.count('_')
 ...: 
In [2]: valid_word('tux', ['_', 'u', 'v', 'w', 'x', 'y', 'z'])
Out[2]: True

In [3]: valid_word('apple', ['_', 'u', 'v', 'w', 'x', 'y', 'z'])
Out[3]: False
In [4]: valid_word('apple', ['_', 'u', 'v', 'w', 'x', 'y', 'l', 'z', '_', 'p', '_', 'p', 'e'])
Out[4]: True

應該為你工作

可能有一種更有效的解決方案,但是該解決方案可以工作:

letters = ['_', 'u', 'v', 'w', 'x', 'y', 'z']

words = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra']

def valid_word(words, letters):
    not_valid = []
    valid = []
    wild = 0

    for letter in letters:
        if letter == '_':
            wild += 1

    for word in words:
        missing = 0
        for letter in word:
            if letter not in letters:
                missing += 1
                if missing > wild:
                    not_valid.append(word)
                    break
        if word not in not_valid:
            s = ''
            for letter in word:
                if letter in letters:
                    s += letter
                else:
                    s += '_'
            valid.append(s)

    return valid

print(valid_word(words, letters))

#output
['yu_z', '_ux']

因此,您創建了一個無效列表,一個有效列表和一個通配變量,該變量計算字母列表中下划線的數量。

然后遍歷您的話語。 如果單詞中缺少的字母的數量大於通配符計算的下划線的數量,請將單詞添加到無效列表中。 否則,在有效列表中逐個字母地添加它,用下划線替換所有缺少的字母。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM