2012-07-13 32 views
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

多久是你的字符串? – 2012-07-13 13:10:03

+1

@NedBatchelder - 太長了。 – 2012-07-13 13:10:30

+5

我建議不要使用'list'作爲變量名稱。這是一個不好的習慣。 – mgilson 2012-07-13 13:10:40

回答

9

一個MemoryError意味着你消耗了所有的RAM。您正在創建一個包含原始字符串的所有尾部的列表。如果你的原始字符串太長,你會消耗大量的內存。

一種可能是使用發電機來產生後綴一次一個,而不是創建所有的人的名單:

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

如果suffixes簡單地遍歷結果來電,你不」甚至不得不改變主叫方。如果你真的需要一個明確的清單,那麼你需要一個不同的解決方案。

+0

哎呀,我只是寫這作爲一個答案:) – mgilson 2012-07-13 13:13:05

+3

一個人必須相當快王牌斯內德。 – msw 2012-07-13 13:14:43

+0

「那麼你需要一個不同的解決方案」 - 是的。獲得更多的RAM。 ;) – mgilson 2012-07-13 13:15:03

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 ...您需要添加哪些內容取決於您使用的是哪一個。