解决anagram时的内存错误

时间:2014-09-15 22:56:09

标签: python memory anagram

我正在尝试解决以下问题:

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秒完成]

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”),然后只看到两个单词具有相同的排序顺序。如果他们这样做,那么原始单词必须是彼此的字谜,因为它们具有相同的字母(以不同的顺序)。