0

私はpythonchallenge.comでいくつかのpythonの問題を解決して自分自身でpythonを教えていますが、使用する文字列が大きすぎてpythonで処理できないため、障害にぶつかりました。次のエラーが表示されます。

my-macbook:python owner1$ python singleoccurrence.py
Traceback (most recent call last):
  File "singleoccurrence.py", line 32, in <module>
    myString = myString.join(line)
OverflowError: join() result is too long for a Python string

この問題に対してどのような代替手段がありますか? 私のコードは次のようになります...

#open file testdata.txt
#for each character, check if already exists in array of checked characters
#if so, skip.
#if not, character.count
#if count > 1, repeat recursively with first character stripped off of page.
# if count = 1, add to valid character array.
#when string = 0, print valid character array.

valid = []
checked = []
myString = ""

def recursiveCount(bigString):
    if len(bigString) == 0:
        print "YAY!"
        return valid
    myChar = bigString[0]
    if myChar in checked:
        return recursiveCount(bigString[1:])
    if bigString.count(myChar) > 1:
        checked.append(myChar)
        return recursiveCount(bigString[1:])
    checked.append(myChar)
    valid.append(myChar)
    return recursiveCount(bigString[1:])

fileIN = open("testdata.txt", "r")
line = fileIN.readline()

while line:
    line = line.strip()
    myString = myString.join(line)
    line = fileIN.readline()

myString = recursiveCount(myString)
print "\n"
print myString
4

1 に答える 1

10

string.joinはあなたが思うことをしません。join は、単語のリストを、指定された区切り記号で 1 つの文字列に結合するために使用されます。すなわち:

>>> ",".join(('foo', 'bar', 'baz'))
'foo,bar,baz'

投稿したコード スニペットは、変数行のすべての文字の間に myString を挿入しようとします。それがどのように急速に大きくなるかを見ることができます:-)。ファイル全体を 1 つの文字列 myString に読み込もうとしていますか? その場合、文字列を連結する方法は次のようになります。

myString = myString + line

私がここにいる間... あなたは Python を学んでいるので、ここでいくつかの他の提案があります。

ファイル全体を変数に読み込む簡単な方法があります。例えば:

fileIN = open("testdata.txt", "r")
myString = fileIN.read()

(これは、既存の strip() コードの正確な動作にはなりませんが、実際には希望どおりに動作する可能性があります。)

また、実用的な Python コードで再帰を使用して文字列を反復処理することはお勧めしません。コードは、文字列内のすべての文字に対して関数呼び出し (およびスタック エントリ) を作成します。また、Python が bigString[1:] のすべての使用について非常にスマートになるかどうかもわかりません。最初の文字のない元のコピーである 2 番目の文字列をメモリ内に作成することもできます。文字列内のすべての文字を処理する最も簡単な方法は次のとおりです。

for mychar in bigString:
    ... do your stuff ...

最後に、「checked」という名前のリストを使用して、特定のキャラクターを以前に見たことがあるかどうかを確認しています。しかし、リストのメンバーシップ テスト ("if myChar in checked") は遅いです。Python では、辞書を使用したほうがよいでしょう。

checked = {}
...
if not checked.has_key(myChar):
    checked[myChar] = True
    ...

あなたが行っているこの演習は、いくつかの Python イディオムを学ぶのに最適な方法です。

于 2009-08-02T20:21:24.150 に答える