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.
Eine, hmm, etwas elegantere Variante, die etwas näher am Problem des OP ist:
``repeat()`` ist eine feine Sache, ``itertools`` ist wohl auch generell mein Lieblingsmodul.