来自给定文件的Python Anagram Finder

时间:2013-03-15 04:10:07

标签: python anagram

我已经在阳光下尝试了所有的东西来解决这个问题并且什么都没有。我甚至不确定如何处理这个问题。说明如下......

您的程序将询问用户包含单词列表的文件的名称。这个单词 list被格式化为每行有一个单词。 •对于每个单词,找到该单词的所有字谜(有些不止一个)。 •输出:报告有多少个单词有0,1,2等字谜。输出形成最大字谜的单词列表(如果有多个集合具有相同的最大长度,则输出全部 他们)。 •您应该使用适当的功能分解。

请记住,我已经编程了不到一个月,所以尽可能地减少了一切。提前谢谢。

1 个答案:

答案 0 :(得分:3)

我认为这是作业。你知道字谜只是一个单词的排列。慢慢来:在学习如何为许多单词做单词之前,学习如何为一个单词计算anagram。以下交互式会话显示了如何计算单词的字谜。你可以从那里继续。

>>> # Learn how to calculate anagrams of a word
>>> 
>>> import itertools
>>> 
>>> word = 'fun'
>>> 
>>> # First attempt: anagrams are just permutations of all the characters in a word
>>> for permutation in itertools.permutations(word):
...     print permutation
... 
('f', 'u', 'n')
('f', 'n', 'u')
('u', 'f', 'n')
('u', 'n', 'f')
('n', 'f', 'u')
('n', 'u', 'f')
>>> 
>>> # Now, refine the above block to print actual words, instead of tuple
>>> for permutation in itertools.permutations(word):
...     print ''.join(permutation)
... 
fun
fnu
ufn
unf
nfu
nuf
>>> # Note that some words with repeated characters such as 'all'
>>> # has less anagrams count:
>>> word = 'all'
>>> for permutation in itertools.permutations(word):
...     print ''.join(permutation)
... 
all
all
lal
lla
lal
lla
>>> # Note the word 'all' and 'lla' each repeated twice. We need to
>>> # eliminate redundancy. One way is to use set:
>>> word = 'all'
>>> anagrams = set()
>>> for permutation in itertools.permutations(word):
...     anagrams.add(''.join(permutation))
... 
>>> anagrams
set(['lal', 'all', 'lla'])
>>> for anagram in anagrams:
...     print anagram
... 
lal
all
lla
>>> # How many anagrams does the word 'all' have?
>>> # Just count using the len() function:
>>> len(anagrams)
3
>>> 

为方便起见,我粘贴了上面的会话here

更新

现在有了Aaron的澄清。最低级别的问题是:你如何确定两个单词是否是字谜?答案是:“当他们有相同数量的字母时。”最简单的方法(对我来说)是对所有字母进行排序并进行比较。

def normalize(word):
    word = word.strip().lower() # sanitize it
    word = ''.join(sorted(word))
    return word

# sort_letter('top') ==> 'opt'
# Are 'top' and 'pot' anagrams? They are if their sorted letters are the same:
if normalize('top') == normalize('pot'):
    print 'they are the same'
    # Do something

现在您已经知道如何比较两个单词了,让我们处理一个单词列表:

>>> import collections
>>> anagrams = collections.defaultdict(list)
>>> words = ['top', 'fun', 'dog', 'opt', 'god', 'pot']
>>> for word in words:
...     anagrams[normalize(word)].append(word)
... 
>>> anagrams
defaultdict(<type 'list'>, {'opt': ['top', 'opt', 'pot'], 'fnu': ['fun'], 'dgo': ['dog', 'god']})
>>> for k, v in anagrams.iteritems():
...     print k, '-', v
... 
opt - ['top', 'opt', 'pot']
fnu - ['fun']
dgo - ['dog', 'god']

在上面的会话中,我们使用anagrams(defaultdict,与默认值的dict相同)来存储单词列表。键是排序的字母。这意味着,anagrams['opt'] ==> ['top', 'opt', 'pot']。从那里,你可以知道哪个是最多的字谜。其余的应该很容易。