string [i:length]给出内存错误

时间:2012-07-13 13:08:11

标签: python python-2.7

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

2 个答案:

答案 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)。它不支持切片,以及无数其他方法popappendextend ...您需要添加哪些方法取决于您使用的方法。