Soluções alternativas quando a cadeia é muito longa para um .join. OverflowError ocorre

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

  •  10-07-2019
  •  | 
  •  

Pergunta

Eu estou trabalhando através de alguns problemas python no pythonchallenge.com me ensinar python e eu atingido um obstáculo, uma vez que a corda Estou estar usando é muito grande para python para manipular. Eu recebo este erro:

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

Que alternativas que eu tenho para este problema? Meu código parece tão ...

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

Solução

string.join não faz o que você pensa. junção é usado para combinar uma lista de palavras em uma única seqüência com o seperator dado. Ou seja:

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

O trecho de código que você postou tentará inserir myString entre cada caractere na linha variável. Você pode ver como é que vai ficar grande rapidamente :-). Você está tentando ler o arquivo inteiro em uma string única, myString? Se assim for, da forma que desejar para concatenar as cordas é assim:

myString = myString + line

Enquanto eu estou aqui ... desde que você está aprendendo Python aqui estão algumas outras sugestões.

Há maneiras mais fáceis de ler um arquivo inteiro em uma variável. Por exemplo:

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

(Isto não tem o comportamento exato de sua faixa existente código (), mas pode de fato fazer o que quiser.)

Além disso, eu nunca recomendar prática Python uso de código recursão para iteração sobre uma corda. Seu código fará uma chamada de função (e uma entrada de pilha) para cada caractere na seqüência. Também não tenho certeza Python vai ser muito inteligente sobre todos os usos de BigString [1:]: ele pode muito bem criar uma segunda corda na memória que é uma cópia do original, sem o primeiro caractere. A maneira mais simples para processar cada caractere em uma string é:

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

Finalmente, você está usando o nome da lista "marcada" para ver se você já viu um caráter particular antes. Mas o teste de adesão em listas ( "se MyChar na verificado") é lento. Em Python você é melhor fora de usar um dicionário:

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

Neste exercício, você está fazendo é uma ótima maneira de aprender vários idiomas Python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top