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 を消費したことを意味します。元の文字列のすべての末尾部分を含むリストを作成しています。元の文字列が長すぎると、大量のメモリが消費されます。

可能性の 1 つは、すべてのサフィックスのリストを作成する代わりに、ジェネレーターを使用して一度に 1 つずつサフィックスを生成することです。

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, append, extend... 追加する必要があるメソッドは、使用するメソッドによって異なります。

于 2012-07-13T13:37:13.057 に答える