Frage

Ich arbeite durch einige Python Probleme auf pythonchallenge.com mich Python zu lehren, und ich habe eine Straßensperre getroffen, da die Saite, die ich bin zu zu verwenden ist groß für Python zu behandeln. Ich erhalte diese Fehlermeldung:

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

Welche Alternativen habe ich für dieses Problem haben? Mein Code sieht aus wie so ...

#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
War es hilfreich?

Lösung

string.join nicht tut, was Sie denken. Join verwendet wird, mit dem angegebenen seperator eine Liste von Worten in eine einzige Saite zu kombinieren. Dh:

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

Die Code-Schnipsel Sie wird versuchen, geschrieben myString zwischen jedem Zeichen in der Variablen Zeile einzufügen. Sie können sehen, wie das schnell :-) groß bekommen. Versuchen Sie, die gesamte Datei in einen einzelnen String, myString zu lesen? Wenn ja, so, wie Sie die Saiten verketten wollen, ist wie folgt:

myString = myString + line

Während ich hier bin ... da Sie lernen hier Python einige andere Vorschläge.

Es gibt einfachere Wege, eine komplette Datei in eine Variable zu lesen. Zum Beispiel:

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

(Dies wird nicht das genaue Verhalten Ihrer bestehenden Streifen () Code haben, aber in der Tat kann das tun, was Sie wollen.)

Außerdem würde ich nie praktische Python-Code verwenden Rekursion empfehlen einen String iterieren. Ihr Code wird einen Funktionsaufruf (und einen Stack-Eintrag) für jedes Zeichen in der Zeichenfolge. Auch ich bin nicht sicher, Python sehr klug sein wird, über alle Verwendungen von grosserstring [1]: es kann gut eine zweite Zeichenfolge im Speicher erstellen, die eine Kopie des Originals, ohne das erste Zeichen ist. Der einfachste Weg, jedes Zeichen in einer Zeichenfolge zu verarbeiten ist:

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

Schließlich Sie werden mit der Liste mit dem Namen „geprüft“, um zu sehen, ob Sie jemals einen besonderen Charakter zuvor gesehen haben. Aber die Mitgliedschaft Test auf Listen ( „wenn MyChar in checked“) ist langsam. In Python sind Sie besser dran mit einem Wörterbuch:

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

Diese Übung Sie tun, ist eine gute Möglichkeit, mehrere Python Idiome zu lernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top