我正在尝试解决以下问题:
anagram是一种文字游戏,是重新排列单词或短语的字母以产生新单词或短语的结果,使用所有原始字母只需一次;例如,orchestra = carthorse。使用http://www.puzzlers.org/pub/wordlists/unixdict.txt处的单词列表,编写一个程序,查找共享包含最多单词的相同字符的单词集。
即使只有1000字节的文件大小,它也会失败。每次创建新列表时,为什么Python会将旧列表保留在内存中?我收到以下错误。
l=list(map(''.join, itertools.permutations(i)))
给了我:
MemoryError
这是我的代码:
import itertools
def anagram():
f=open('unixdict.txt')
f2=open('result_anagram.txt','w')
words = f.read(1000).split('\n')
for i in words:
l=[]
l=list(map(''.join, itertools.permutations(i)))
l.remove(i)
for anagram in l:
if l==i:
f2.write(i + "\n")
return True
anagram()
根据建议将上述代码更改为。但仍然会出现内存错误。
import itertools
def anagram():
f=open('unixdict.txt')
f2=open('result_anagram.txt','w')
words = set(line.rstrip('\n') for line in f)
for i in words:
l= map(''.join, itertools.permutations(i))
l =(x for x in l if x!=i)
for anagram in l:
if anagram in words:
f2.write(i + "\n")
return True
anagram()
的MemoryError [22.2秒完成]
答案 0 :(得分:2)
import urllib
def anagram():
f=urllib.urlopen('http://www.puzzlers.org/pub/wordlists/unixdict.txt')
words = f.read().split('\n')
d={''.join(sorted(x)):[] for x in words} #create dic with empty list as default
for x in words:
d[''.join(sorted(x))].append(x)
max_len= max( len(v) for k,v in d.iteritems())
for k,v in d.iteritems():
if len(v)>=max_len:
print v
anagram()
输出:
['abel', 'able', 'bale', 'bela', 'elba']
['alger', 'glare', 'lager', 'large', 'regal']
['angel', 'angle', 'galen', 'glean', 'lange']
['evil', 'levi', 'live', 'veil', 'vile']
['caret', 'carte', 'cater', 'crate', 'trace']
['elan', 'lane', 'lean', 'lena', 'neal']
在5.7秒内完成
答案 1 :(得分:1)
这里有一个解决问题的提示:如果两个字符串具有相同的字母集合,则它们是彼此的字谜。您可以排序单词(例如将“orchestra”变成“acehorrst”),然后只看到两个单词具有相同的排序顺序。如果他们这样做,那么原始单词必须是彼此的字谜,因为它们具有相同的字母(以不同的顺序)。