Soluciones alternativas cuando una cadena es demasiado larga para un .join. OverflowError ocurre

StackOverflow https://stackoverflow.com/questions/1219733

  •  10-07-2019
  •  | 
  •  

Pregunta

Estoy trabajando en algunos problemas de python en pythonchallenge.com para enseñarme a mí mismo python y he encontrado un obstáculo, ya que la cadena que voy a usar es demasiado grande para que Python pueda manejarla. Recibo este error:

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

¿Qué alternativas tengo para este problema? Mi código se ve así ...

#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
¿Fue útil?

Solución

string.join no hace lo que usted piensa. join se usa para combinar una lista de palabras en una sola cadena con el separador dado. Es decir:

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

El fragmento de código que publicó intentará insertar myString entre cada carácter en la línea variable. Puedes ver cómo se hará grande rápidamente :-). ¿Estás tratando de leer todo el archivo en una sola cadena, myString? Si es así, la forma en que desea concatenar las cadenas es la siguiente:

myString = myString + line

Mientras estoy aquí ... ya que estás aprendiendo Python aquí hay algunas otras sugerencias.

Hay formas más fáciles de leer un archivo completo en una variable. Por ejemplo:

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

(Esto no tendrá el comportamiento exacto de su código strip () existente, pero de hecho puede hacer lo que quiera).

Además, nunca recomendaría que el código Python práctico use la recursión para iterar sobre una cadena. Su código hará una llamada de función (y una entrada de pila) para cada carácter en la cadena. Además, no estoy seguro de que Python sea muy inteligente sobre todos los usos de bigString [1:]: bien puede crear una segunda cadena en la memoria que es una copia del original sin el primer carácter. La forma más sencilla de procesar cada carácter en una cadena es:

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

Finalmente, está utilizando la lista llamada " marcada " para ver si alguna vez has visto un personaje en particular antes. Pero la prueba de membresía en las listas (" si myChar está marcado ") es lenta. En Python es mejor usar un diccionario:

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

Este ejercicio que estás haciendo es una excelente manera de aprender varios modismos de Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top