Längste Wörter im Text

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
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Freitag 2. November 2012, 18:23

Hallo miteinander

Ich möchte gerne ein Programm schreiben, das das längste bzw. die längsten Wörter ausgibt.
Siehe dazu folgendes Snippet:

Code: Alles auswählen

## for each line in the file
	for line in infile:
		# split the line into a list of strings
		line_list = line.split()
#		print 'Line as List:', line_list
		
		# for each word in the line
		for word in line_list:
			# check if the word is longer than the current longest word
			if len(word) > max_word_length:
				max_word = word
				max_word_length = len(word)
                        
		for word in line_list: # neu: Alle längsten Wörter
			if len(word) == max_word_length:
                        	max_word_list.append(word)
Das längste Wort, das zuerst gefunden wird, wird korrekt ausgegeben. Dann sollten ja auch noch die Wörter ausgegeben werden, welche ebenfalls dieselbe Länge haben. Aber: Hier erscheinen auch solche, die wesentlich weniger Zeichen haben. Wieso?

Vielen Dank für die Korrektur.
Zuletzt geändert von Anonymous am Freitag 2. November 2012, 18:41, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

Freitag 2. November 2012, 18:43

@MarcelF6: Du verarbeitest Zeilenweise. Woher soll das Programm in Zeile x wissen wie lang das längste Wort in den nachfolgenden Zeilen ist? Das kann so doch gar nicht funktionieren.

Edit: Ist eigentlich ein Dreizeiler bei einem gegebenen Dateiobjekt die Menge der längsten Worte zu ermittln (ungetestet):

Code: Alles auswählen

    words = infile.read().split()
    max_length = max(words, key=len)
    max_words = set(word for word in words if len(word) == max_length)
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Samstag 3. November 2012, 16:26

Besten Dank für die Antwort.
Dein Beispiel funktioniert noch nicht ganz so, wie es sollte. Aber da ich set's noch nicht kenne (bzw. wir (noch) nicht damit gearbeitet haben), wollte ich fragen, ob es nicht eine Möglichkeit mit Listen oder Dictionaries gibt?
BlackJack

Samstag 3. November 2012, 16:34

@MarcelF6: Was funktioniert denn nicht wie es soll?
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Samstag 3. November 2012, 16:54

Wenn ich max_words ausprinten will, wird nur "set([])" ausgegeben. Und wenn ich prüfe, was unter max_length gespeichert wird, erscheint statt eine Zahl ein 'e'.
Ich dachte zB daran, ob es nicht möglich ist, alle Wörter mit der Länge n (und n kann man dann als max_length definieren) in einer Liste (oder was auch immer) zu finden. (Wie) ist das möglich?
BlackJack

Samstag 3. November 2012, 17:19

Die Zeile muss natürlich ``max_length = max(len(word) for word in words)`` lauten. Wenn da vorher nur ein 'e' hinterlegt war, dann stimmt aber etwas mit Deiner Datei nicht.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Samstag 3. November 2012, 17:41

So funktioniert's, danke! :)
Aber was komisch ist: Erstens findet diese Variante auch nur 1 Wort (es hat mehrere mit der längsten Anzahl zeichen) und 2.ist es ein viel kürzeres Wort...
Wie kann das sein?

Ich habe es so implementiert:

Code: Alles auswählen

infile = open(filename, 'r')
	
	## for each line in the file
	for line in infile:
		# split the line into a list of strings
		line_list = line.split()
#		print 'Line as List:', line_list
		
		# for each word in the line
		for word in line_list:
			# check if the word is longer than the current longest word
			#if len(word) > max_word_length:
			#	max_word = word
			#	max_word_length = len(word)
                 
			words = line_list
			max_length = max(len(word) for word in words)
			print max_length 
			max_words = set(word for word in words if len(word) == max_length)			
	
Sirius3
User
Beiträge: 10900
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 3. November 2012, 18:01

Hallo Marcel,

Ich übersetz mal, was Du geschrieben hast:
Für jede Zeile in Deiner Datei wird
1. die Länge des längsten Wortes gesucht in dieser Zeile
2. alle Wörter mit dieser Länge in max_words geschrieben.
exakt das gleiche wird so oft wiederholt wie es Wörter in dieser Zeile gibt.

Dank Deinem print dürftest Du ziemlich viele Zahlen ausgegeben bekommen.

BlackJacks Antwort braucht gar keine Schleife!
Es wird nämlich die gesamte Datei mit einem read().split() in einzelne Wörter
aufgespalten und dann das längste Wort gesucht.

Das ganze geht natürlich auch ohne set, nur dann könnte ein Wort mehrfach
in der Liste vorkommen.

Grüße
Sirius
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Samstag 3. November 2012, 18:25

Ok - dann habe ich aber trotzdem ein "Problem" mit dem 'set', wenn ich gerne alle Wörter mit der längsten Länge haben möchte, oder?
(denn ob ein Wort 1, 2 oder mehrmals vorkommt sollte ich schon wissen - ich könnte ja dann einfach die Häufigkeiten separat ausgeben, statt 5x dasselbe Wort). Dann wären wir wieder bei Listen und dicts... (sorry :) )

PS: Danke für die Darstellung - so macht der Code tatsächlich keinen Sinn...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7477
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sonntag 4. November 2012, 13:39

MarcelF6 hat geschrieben:Ok - dann habe ich aber trotzdem ein "Problem" mit dem 'set', wenn ich gerne alle Wörter mit der längsten Länge haben möchte, oder?
Wieso das? In einer Menge sind alle *verschiedenen* Elemente enthalten - wenn ``Donaudampfschifffahrtskapitän`` nun fünf mal in Deinem Text vorkommt und das längste Wort ist, dann taucht es in einem Set eben nur einmal auf. Aber was ist daran denn das Problem?
MarcelF6 hat geschrieben: (denn ob ein Wort 1, 2 oder mehrmals vorkommt sollte ich schon wissen - ich könnte ja dann einfach die Häufigkeiten separat ausgeben, statt 5x dasselbe Wort). Dann wären wir wieder bei Listen und dicts... (sorry :) )
Ach so, wenn Du dazu die Anzahl wissen willst, dann böte sich ein ``collections.Counter`` Objekt an.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten