![](/img/trans.png)
[英]Python - Scoring a list of words using a dictionary of Scrabble letter values
[英]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.