Fehlermeldung:Traceback (most recent call last): File &quo

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kuschelh
User
Beiträge: 8
Registriert: Freitag 5. Dezember 2008, 22:24

Hallo, ich habe eine Funktion, die

Code: Alles auswählen

def selectUpperCaseNGrams(liste,tupelzahl):
	#liste = liste.split()
	tupel = []
	zaehler = 0;	
	for i in liste:
		buchstabe = 0
		for j in i:
			if j.isupper():
				tupel[zaehler].append(i)
				#tupel.append(zaehler+1)
				buchstabe += 1
				break
			#return tupel
		zaehler +=1
	#for i < tupelzahl:
	print tupel	
	#print type(tupel)
lautet und es kommt immer die Fehlermeldung beim Aufrufen

Code: Alles auswählen

>>> selectUpperCaseNGrams(["Was","Wie","Warum","wer","wo","Man Hattan"],2)

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    selectUpperCaseNGrams(["Was","Wie","Warum","wer","wo","Man Hattan"],2)
  File "C:\Python25\Doc\splitSent.py", line 14, in selectUpperCaseNGrams
    tupel[zaehler].append(i)
IndexError: list index out of range
Kann mir jemand helfen?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Du kannst nicht auf Listenelemente zugreifen, die noch nicht existieren. (Und nebenbei erwähnt: So würde ich bei Listen sowieso nicht arbeiten, schon gar nicht mit der expliziten Benennung des Zählers). An was soll da überhaupt was "appended" werden? Du definierts doch gar nicht, welche Art von Objekten die Liste enthalten soll.

In deinem Fall böte sich ein Dictionary an, welches für derartiges auch eher ausgelegt ist.
kuschelh
User
Beiträge: 8
Registriert: Freitag 5. Dezember 2008, 22:24

Aber auf welches Listenelement greife ich denn zu,das noch nicht existiert?
Das mit der Zählerbenennung weiß ich auch;)
Es ist so:Ich lese eine Liste ein, prüfe ob ein Wort Großbuchstaben hat, wenn ja, soll es an eine neue Liste (fälschlicherweise Tupel gennant) appended werden.
Vorhin hats geklappt, nur jetzt nicht...
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Benennung ist grauenhaft wie der Rest des Codes, dass du tupel als Namen für eine Liste verwendest zeigt auch schon dass du definitiv das Tutorial durcharbeiten solltest.

Konkret hapert es daran dass du auf ein Element in der Liste zugreifen willst das dort nicht vorhanden ist(zeile 9), der Ansatz eine Zeile weiter ist besser zeigt aber recht gut dein Ansatz von programming by accident.

Edit: Deine Problem kann man übrigens in einer Zeile lösen wenn ich das jetzt richtig verstanden habe ;)
kuschelh
User
Beiträge: 8
Registriert: Freitag 5. Dezember 2008, 22:24

und wie müsste die zeile trotz grauenhafter Bezeichnungen lauten?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Auf das da:

Code: Alles auswählen

In [28]: give_me_a_godlike_list = []

In [29]: give_me_a_godlike_list[1322434] = "5"
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)

/media/Daten/Projects/battle.v1.1.0/<ipython console> in <module>()

IndexError: list assignment index out of range

In [30]: # doesnt work
das 1322434 element existiert nicht. Die 1322433 anderen Elemente vor im müssen erst angelegt (definiert) werden, sowas macht man mittels append().
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

[word for word in words if any(char.isupper() for char in word]
kuschelh
User
Beiträge: 8
Registriert: Freitag 5. Dezember 2008, 22:24

Danke!!!
Jetzt gehts.
Hab gleich mal alle i un j umbenannt.

DANKE!!

Jetz hab ich noch ein Problem:Wie schreib ich das als List Comprehension?

Code: Alles auswählen

for word in words:
		buchstabe = 0
		[word for word in words if (char.isupper() for char in word):break]
		for char in word:
			if char.isupper():
				#tupel[zaehler].append(word)
				tupel.append(word)
				buchstabe += 1
				break
			#return tupel
		zaehler +=1
	#for i < tupelzahl:
	print tupel	
	#print type(tupel)
kuschelh
User
Beiträge: 8
Registriert: Freitag 5. Dezember 2008, 22:24

@str1442:
Wie kann ich denn jetzt mittels append z.B. 2000 weitere einfügen?
da steig ich bei der doc noch nicht durch....
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

DasIch's Lösung *ist* bereits die Lösung.

Zuerst wird jedes Element in "words" durchgangen. Dieses wird zurückgeben wenn *irgendein* Element die Bedingung char.isupper erfüllt. Das wird mit any() erreicht. LC's generieren sofort neue Listen, es ist das Ergebnis das LC.

Für alles weitere bitte unbedingt ein gutes Tutorial durcharbeiten (keinesfalls das Galileo Openbook, am besten Python.org Tutorial).

ADD:

2000 mal hintereinander append mit einem Element durchführen. Es gibt natürlich noch andere Möglichkeiten, append ist aber die grundlegendste.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

str1442 hat geschrieben:2000 mal hintereinander append mit einem Element durchführen. Es gibt natürlich noch andere Möglichkeiten, append ist aber die grundlegendste.
Eine andere Möglichkeit wäre etwa ``itertools.repeat()``, das das selbe Objekt ``times`` mal zurückgibt. Hier mal ein Beispiel mit Strings die 10 mal an eine Liste angehängt werden.

Code: Alles auswählen

['holla'] + list(itertools.repeat('huhu', 10))
Eine, hmm, etwas elegantere Variante, die etwas näher am Problem des OP ist:

Code: Alles auswählen

l = ['holla']
l.extend(itertools.repeat('huhu', 10))
``repeat()`` ist eine feine Sache, ``itertools`` ist wohl auch generell mein Lieblingsmodul.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten