これはうまくいくはずです。私はトリッキーな部分をコメントしようとしましたが、あなたが理解していないコードがいくつかあるかどうか尋ねるのをためらってください。
import itertools
import string
import numpy as np
#takes a list of words as input ['door', 'chair', 'wall'], and returns the words alphabetically sorted [['door', 'door'], ['achir', 'chair'], ['allw', 'wall']]
def sortWordList(word_list):
return np.array([["".join(sorted(word)), word] for word in word_list])
#recursive function to get all unordered n-letter subsets of `letters`, without repetition. NLetterSubsets(2, "fly") == ["fl", "fy", "ly"]; NLetterSubsets(2, "foo") == ["fo", "fo", "oo"]
def NLetterSubsets(n, letters):
if n == len(letters):
return [letters]
if n > len(letters) or len(letters) == 0:
return []
return [letters[0] + x for x in NLetterSubsets(n-1, letters[1:])] + NLetterSubsets(n, letters[1:])
#loads word_list from a newline-separated file
def loadWordList(filename):
with open(filename, 'r') as f:
return [line.rstrip('\n') for line in f]
word_list = loadWordList('words.txt')
word_list = sortWordList(word_list)
print(word_list)
rack = 'trackable'
blank_count = rack.count('?')
if blank_count:
rack = rack.replace('?','')
word_set = set()
#possible letters is the list of all possible values taken by the blank(s)
possibleLetters = ['']
if blank_count >= 1:
possibleLetters += [l for l in string.ascii_lowercase]
if blank_count == 2:
possibleLetters += [l+m for l in string.ascii_lowercase for m in string.ascii_lowercase]
for blanks in possibleLetters:
for i in range(3-len(blanks), 9-len(blanks)):
#gets a subset of letters from rack, to which we will add the blank values to form a word of length in range(3,9)
for setOfLetter in NLetterSubsets(i-blank_count, rack):
sortedWordToSearchFor = ''.join(sorted(setOfLetter + blanks))
#if the sorted list of letters we have is also present in the word_set, then take the associated word
for index in np.where(word_list[:,0] == sortedWordToSearchFor)[0]:
word_set.add(word_list[index][1])
print(word_set)
ありがとうございました。それが私が質問している理由です。その理由で質問を投票してくれてありがとう。 – Rebuggered
さて、もう1つの 'string.ascii_lowercase:for l 'をもう1つの変数名に変更するだけで、2つの異なる文字を得ることができます。私はその質問をdownvoteしなかった、btw。 – Efferalgan
質問を改善して、さらなる批判/投票を避けることができれば、できる限りのことはすべてやります。 – Rebuggered