Обходные пути, когда строка слишком длинна для .join. Произошла ошибка OverflowError - PullRequest
0 голосов
/ 03 августа 2009

Я работаю над некоторыми проблемами с 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

1 Ответ

10 голосов
/ 03 августа 2009

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:]: он может создать в памяти вторую строку, которая является копией оригинала без первого символа. Самый простой способ обработать каждый символ в строке:

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

Наконец, вы используете список с именем «флажок», чтобы увидеть, видели ли вы когда-либо определенный символ раньше. Но проверка членства в списках («если myChar в проверен») идет медленно. В Python лучше использовать словарь:

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

Это упражнение, которое вы выполняете, является отличным способом выучить несколько идиом Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...