我有这个程序来形成一组从字符串集合按字典顺序排序的字符串。输入字符串的数量和字符串本身作为输入,程序用于按字典顺序形成一个包含输入字符串和子字符串的集合。
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
我没有优化代码。可以对排序进行优化吗?可以扩展设置数据结构和列表的大小吗?
答案 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技术解决您的问题。