Soluzioni alternative quando una stringa è troppo lunga per un .join. Si verifica OverflowError

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

  •  10-07-2019
  •  | 
  •  

Domanda

Sto lavorando ad alcuni problemi di Python su pythonchallenge.com per insegnare a me stesso Python e ho raggiunto un blocco, poiché la stringa che sto usando è troppo grande per essere gestita da Python. Ricevo questo errore:

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

Quali alternative ho per questo problema? Il mio codice sembra simile ...

#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
È stato utile?

Soluzione

string.join non fa ciò che pensi. join viene utilizzato per combinare un elenco di parole in una singola stringa con il separatore specificato. Vale a dire:

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

Lo snippet di codice che hai inserito tenterà di inserire myString tra tutti i caratteri nella riga della variabile. Puoi vedere come diventerà rapidamente grande :-). Stai cercando di leggere l'intero file in una singola stringa, myString? In tal caso, il modo in cui si desidera concatenare le stringhe è in questo modo:

myString = myString + line

Mentre sono qui ... dato che stai imparando Python ecco alcuni altri suggerimenti.

Esistono modi più semplici per leggere un intero file in una variabile. Ad esempio:

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

(Questo non avrà il comportamento esatto del tuo codice strip () esistente, ma in realtà potrebbe fare quello che vuoi.)

Inoltre, non consiglierei mai il pratico codice Python di usare la ricorsione per scorrere su una stringa. Il codice eseguirà una chiamata di funzione (e una voce dello stack) per ogni carattere nella stringa. Inoltre non sono sicuro che Python sarà molto intelligente su tutti gli usi di bigString [1:]: potrebbe benissimo creare una seconda stringa in memoria che è una copia dell'originale senza il primo carattere. Il modo più semplice per elaborare ogni carattere di una stringa è:

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

Infine, stai utilizzando l'elenco chiamato " controllato " per vedere se hai mai visto un personaggio in particolare prima d'ora. Ma il test di appartenenza agli elenchi ("se myChar è spuntato") è lento. In Python stai meglio usando un dizionario:

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

Questo esercizio che stai facendo è un ottimo modo per imparare diversi modi di dire di Python.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top