在python代码中排序子字符串时抛出内存错误

时间:2013-07-28 06:53:39

标签: python python-2.7

我有这个程序来形成一组从字符串集合按字典顺序排序的字符串。输入字符串的数量和字符串本身作为输入,程序用于按字典顺序形成一个包含输入字符串和子字符串的集合。

strst=set()
nos=input()

for i in range(0,nos):
    ele=raw_input()
    for j in range(0,len(ele),1):
        for k in range(j+1,len(ele)+1):
                strst.add(ele[j:k])

strlst=sorted(strst)

print strlst

Thi程序将子字符串存储到一个集合中,然后对其保留字典顺序进行排序,最后打印整个列表

例如:

INPUT :

2             //number of input strings
aab
aac

OUTPUT

['a', 'aa', 'aab', 'aac', 'ab', 'ac', 'b', 'c']

该程序适用于小型输入但是当输入大小,即输入字符串的数量和每个字符串的长度在2000范围内增加时,它给出了一个例外:

MemoryError thrown on line 9

我没有优化代码。可以对排序进行优化吗?可以扩展设置数据结构和列表的大小吗?

2 个答案:

答案 0 :(得分:0)

说明它似乎是多余的我怀疑你得到内存错误的原因是你的内存不足。

如果2个大多数重叠的长度为3的字符串你得到8个元素,那么所有可能的3个字母的非空白覆盖率= 26 + 650 + 15600 = 16276

快速测试:

>>> n = 0
>>> for m in range(1, 20):
...     for i in itertools.permutations(range(26), m):
...         n+=1
...     print m, n
... 
1 26
2 676
3 16276
4 375076
5 8268676
6 174034276

...

答案 1 :(得分:0)

正如Steve正确指出的那样,问题是你在内存中输入字符串的输入字符串组合的数量。

对此的正确解决方案是使用生成函数来生成输入字符串的组合。

幸运的是,python标准库已经包含 itertools 包,它可以帮助您以更少的代码和更有效的方式实现您想要的功能。下面给出了一个示例代码片段,它会产生您在问题中显示的相同输出:

import itertools
from itertools import combinations
x  = "aab"
y =  "aac"
x_permutation =[]
y_permutation = []

#use the combinations method within the itertools package to generate all possible combinations of a given length  for a given string

for i in xrange(1,len(x)+1):
        x_permutation = x_permutation + list(map("".join,combinations(x,i)))

for i in xrange(1,len(y)+1):
        y_permutation = y_permutation + list(map("".join, combinations(y,i)))

#if the input string is  already sorted for e.g. "ABCD" , you do not really need to call the sort.However, when we do not have this guarantee then it is better to call sort()

x_permutation.sort()
y_permutation.sort()

#merge the two lists into a set and then sort the set using the built-in **sorted()**
output_set =sorted(set (x_permutation + y_permutation))

print output_set

上述脚本的输出为:['a', 'aa', 'aab', 'aac', 'ab', 'ac', 'b', 'c']

希望现在这应该可以帮助您考虑使用itertools技术解决您的问题。