Seite 1 von 1

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

Verfasst: Freitag 5. Dezember 2008, 22:29
von kuschelh
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?

Verfasst: Freitag 5. Dezember 2008, 22:34
von str1442
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.

Verfasst: Freitag 5. Dezember 2008, 22:38
von kuschelh
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...

Verfasst: Freitag 5. Dezember 2008, 22:58
von DasIch
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 ;)

Verfasst: Freitag 5. Dezember 2008, 23:03
von kuschelh
und wie müsste die zeile trotz grauenhafter Bezeichnungen lauten?

Verfasst: Freitag 5. Dezember 2008, 23:04
von str1442
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().

Verfasst: Freitag 5. Dezember 2008, 23:06
von DasIch

Code: Alles auswählen

[word for word in words if any(char.isupper() for char in word]

Verfasst: Freitag 5. Dezember 2008, 23:23
von kuschelh
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)

Verfasst: Freitag 5. Dezember 2008, 23:31
von kuschelh
@str1442:
Wie kann ich denn jetzt mittels append z.B. 2000 weitere einfügen?
da steig ich bei der doc noch nicht durch....

Verfasst: Freitag 5. Dezember 2008, 23:31
von str1442
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.

Verfasst: Samstag 6. Dezember 2008, 01:22
von Leonidas
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.