Solutions de contournement lorsqu'une chaîne est trop longue pour un .join. OverflowError se produit

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

  •  10-07-2019
  •  | 
  •  

Question

Je suis en train de résoudre quelques problèmes de python sur pythonchallenge.com pour apprendre à me familiariser avec le python et je me suis heurté à un obstacle, car la chaîne que je dois utiliser est trop grosse pour que python puisse la gérer. Je reçois cette erreur:

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

Quelles alternatives ai-je pour ce problème? Mon code ressemble à ça ...

#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
Était-ce utile?

La solution

string.join ne fait pas ce que vous pensez. join est utilisé pour combiner une liste de mots en une seule chaîne avec le séparateur donné. C'est à dire:

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

L'extrait de code que vous avez posté tentera d'insérer myString entre chaque caractère de la ligne de variable. Vous pouvez voir comment cela va devenir grand rapidement :-). Essayez-vous de lire le fichier entier dans une seule chaîne, myString? Si tel est le cas, la façon dont vous souhaitez concaténer les chaînes est la suivante:

myString = myString + line

Pendant que je suis ici ... puisque vous apprenez le python, voici d'autres suggestions.

Il existe des moyens plus simples de lire un fichier entier dans une variable. Par exemple:

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

(Cela n'aura pas le comportement exact de votre code strip () existant, mais peut en fait faire ce que vous voulez.)

De plus, je ne recommanderais jamais de code Python pratique utilisant la récursivité pour itérer sur une chaîne. Votre code fera un appel de fonction (et une entrée de pile) pour chaque caractère de la chaîne. De plus, je ne suis pas sûr que Python sera très intelligent à propos de toutes les utilisations de bigString [1:]: il pourrait bien créer une seconde chaîne en mémoire qui est une copie de l'original sans le premier caractère. Le moyen le plus simple de traiter chaque caractère d'une chaîne est le suivant:

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

Enfin, vous utilisez la liste intitulée "vérifié". pour voir si vous avez déjà vu un personnage en particulier auparavant. Mais le test d'adhésion sur les listes ("si myChar est coché") est lent. En Python, mieux vaut utiliser un dictionnaire:

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

Cet exercice que vous faites est un excellent moyen d'apprendre plusieurs idiomes de Python.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top