def suffix(stng):
list = []
length = len(stng)
for i in range(length):
x = stng[i:length] ## This gives a Memory Error..See below
list.append(x)
return list
这段代码是我在interviewstreet.com上解决问题的一部分,但是当我提交它时,我收到内存错误...我想知道如何纠正它?
这是追溯:
Original exception was:
Traceback (most recent call last):
File "/run-1342184337-542152202/solution.py", line 35, in
listofsuffix=suffix(var)
File "/run-1342184337-542152202/solution.py", line 13, in suffix
x=stng[i:length]
MemoryError
答案 0 :(得分:9)
MemoryError
表示您已经消耗了所有内存。您正在创建一个包含原始字符串的所有尾随部分的列表。如果原始字符串太长,则会消耗大量内存。
一种可能性是使用生成器一次生成一个后缀,而不是创建所有这些后缀的列表:
def suffixes(stng):
for i in xrange(len(stng)):
yield stng[i:]
如果suffixes
的调用者只是遍历结果,您甚至不必更改调用者。如果您确实需要明确的列表,那么您将需要一个不同的解决方案。
答案 1 :(得分:0)
“我需要返回一个列表” - 这是不太可能的。你只需要返回一个看起来像列表就足以使它工作的对象。
class FakeList(object):
def __init__(self,strng):
self.string=strng
self._idx=0
def __getitem__(self,i):
return self.strng[:i]
def __len__(self):
return len(self.string)
def __iter__(self):
return self
def __contains__(self,other):
return other in self.string
def next(self):
if(self._idx<len(self)):
self._idx+=1
return self[self._idx-1]
else:
raise StopIteration
a=FakeList("My String")
print a[3]
print a[4]
for i in a:
print i
这会创建一个对象,您可以随机访问该对象并像列表一样进行迭代。它还允许您拨打len(my_fake_list)
。它不支持切片,以及无数其他方法pop
,append
,extend
...您需要添加哪些方法取决于您使用的方法。