文字列が.joinに対して長すぎる場合の回避策。 OverflowErrorが発生します
質問
使用している文字列がpythonで処理するには大きすぎるため、pythonchallenge.comで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
解決
string.join はあなたが思っていることをしません。 joinは、単語のリストを指定されたセパレーターで単一の文字列に結合するために使用されます。すなわち:
>>> ",".join(('foo', 'bar', 'baz'))
'foo,bar,baz'
投稿したコードスニペットは、変数行のすべての文字の間にmyStringを挿入しようとします。あなたはそれがどのようにすぐに大きくなるかを見ることができます:-)。ファイル全体を単一の文字列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 ...
最後に、「チェック済み」という名前のリストを使用しています。特定のキャラクターを見たことがあるかどうかを確認します。ただし、リストのメンバーシップテスト(「myCharがチェックされている場合」)は遅いです。 Pythonでは、辞書を使用する方が良いでしょう:
checked = {}
...
if not checked.has_key(myChar):
checked[myChar] = True
...
この演習では、Pythonのいくつかのイディオムを学ぶことができます。