Python-给定输入字母可能的英语单字字谜
我知道以前有人问过这个问题的变体,但我无法理解以前的任何实现,因为它们大多数都涉及使用集合和 issubset 方法。
这就是我想做的:我在字典中有一组单词和可能的字母列表。我想知道是否可以通过重新排列列表中的字母来形成该集合的成员。这是我当前的实现:
def solve(dictionary, letters):
for word in dictionary: #for each word in the dictionary
if len(word) > len(letters): # first optimization, doesn't check words that are larger than letter set
continue
else:
scrambledword = "".join([b for b in sorted(list(word))]) #sorts the letters in each word
if set(scrambledword).issubset(letters):
print word
def main():
dictionary = set([x.strip() for x in open("C:\\Python27\\dictionary.txt")])
letters = sorted(['v','r','o','o','m','a','b','c','d'])
solve(dictionary, letters)
main()
此实现的明显问题是,会发现某些单词在“字母”中使用多个字母。例如,尽管字母列表中只有一份“a”和“r”,但单词“cardboard”显示为有效单词。如何在列表上使用“issubset”方法?
I know variations of this have been asked before, but I was unable to understand any of the previous implementations because most of them involved using sets and the issubset method.
Here is what I am trying to do: I have a set of words in a dictionary and a list of possible letters. I want to find if the members of the set can be formed through re-arranging the letters in the list. Here is my current implementation:
def solve(dictionary, letters):
for word in dictionary: #for each word in the dictionary
if len(word) > len(letters): # first optimization, doesn't check words that are larger than letter set
continue
else:
scrambledword = "".join([b for b in sorted(list(word))]) #sorts the letters in each word
if set(scrambledword).issubset(letters):
print word
def main():
dictionary = set([x.strip() for x in open("C:\\Python27\\dictionary.txt")])
letters = sorted(['v','r','o','o','m','a','b','c','d'])
solve(dictionary, letters)
main()
The obvious problem with this implementation is that some words will be found that use more than one letter in "letters." For example, the word 'cardboard' appears as a valid word, despite there being only one copy of 'a' and 'r' in the letters list. How do I use the "issubset" method on lists?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
要知道你是否可以用一组字母组成一个单词[哎呀,我自己做了——我的意思是“集合”!],你希望每个字母至少出现正确的次数,所以我认为我们'我们必须以某种方式在那里进行计数。根据定义,Python 集不关心源列表中的元素数量。也许像
给予
Counter 这样的东西是一个方便的实用程序类:
[DSM:返回!我删除了一个不起作用的社区编辑,因为计数器实例不可散列。]
如果搜索速度是一个问题,那么您可以权衡内存和预计算时间:
[呵呵。我刚刚注意到“蓟”本身不在列表中,但那是因为它不在单词文件中..]
是的,单词文件中确实存在明显的“非单词”:
To know if you can make a word out of a set of letters [oops, I did it myself -- I meant 'collection'!], you want every letter to occur at least the right number of times, so I think we're going to have to work the counts in there somehow. By definition, Python sets don't care about the number of elements in a source list. Maybe something like
giving
Counter is a handy utility class:
[DSM: the return! I removed a community edit which doesn't work because Counter instances aren't hashable.]
If searching speed is a concern, then you can trade off memory and precomputation time:
[Heh. I just noticed that 'thistles' itself isn't in the list, but that's because it's not in the words file..]
And yes, the apparent "nonwords" there are really in the words file:
如果您寻找字谜词,换句话说,您想要重新排列,但使用所有它们(而不是仅使用子集),那么还有另一种解决方案。
您首先预处理字典中的所有单词。给定一个单词,您可以生成用相同字母但按字母顺序书写的单词:
并将这些新单词放入一个集合
newDictionary
然后你的函数可以对字母调用alphabetize并检查结果是否在字典中。
Alphabetize 函数是 anagrams 的一个特征:当且仅当两个单词应用 Alphabetize 时产生相同的结果时,它们才是彼此的 anagrams。
If you look for anagrams, in other words you want to rearrange, but use all of them (as opposed to use only a subset) then there is another solution.
You first preprocess all the words in the dictionary. Given a word, you produce the word written with the same letters but in alphabetical order:
and put those new words in a set
newDictionary
Then your function can call alphabetize on letters and check whether the result in in the dictionary.
The alphabetize function is a characteristic of anagrams: two words are anagrams of each other if and only if they produce the same result when alphabetize is applied to them.
导入
集合
,我们定义一个可散列的多重集:我们现在将词汇表预处理为字母字典 ->{anagram1,anagram2,...}:
您的“解决”函数现在需要 O(1)时间:
示例:
Importing
collections
, we define a hashable multiset:We now preprocess the vocabulary into a dict of letters->{anagram1,anagram2,...}:
Your 'solve' function now takes O(1) time:
Example: