0
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
4

2 回答 2

10

AMemoryError表示您已经消耗了所有 RAM。您正在创建一个包含原始字符串的所有尾随部分的列表。如果你的原始字符串太长,你会消耗很多内存。

一种可能性是使用生成器一次生成一个后缀,而不是创建所有后缀的列表:

def suffixes(stng):
    for i in xrange(len(stng)):
         yield stng[i:]

如果调用者suffixes只是简单地迭代结果,您甚至不必更改调用者。如果您确实需要一个明确的列表,那么您将需要一个不同的解决方案。

于 2012-07-13T13:12:32.093 回答
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你需要添加哪些取决于你使用的那些。appendextend

于 2012-07-13T13:37:13.057 回答