Hallo und Willkommen im Forum!
Ich habe Deine Frage mal ins "Allgemeine" Forum verschoben. Das Ideen Forum ist eher als Ort für Brainstorming für Projektideen zu verstehen.
Zu Deiner Frage: Ich würde das alles anders angehen. Du schreibst imho zu viel Code, *ohne* die einzelnen Stücke separat zu testen.
Alleine Deine Extraktion der letzten drei Buchstaben aus einem String ist falsch. Das hätte Dir auch ohne den gesamten Code drum herum in einer Python-Shell schnell auffallen können:
Code: Alles auswählen
In [2]: x = "Hallo"
In [3]: x[-3:-1]
Out[3]: 'll'
In [4]: x[-3:]
Out[4]: 'llo'
(Ich verwende IPython als Shell - daher die [nummer]-Syntax statt ">>>", nicht verwirren lassen!)
Ich würde auch die Schleife vereinfachen. Im Endeffekt ist es ja richtig, dass Du jedes Element mit jedem anderen vergleichen musst. Ich würde aber mit `set.pop` (oder eben `list.pop`) arbeiten. Damit hast Du als äußere Schleife im Grunde das hier:
Als nächstes iterierst Du *direkt* über die verbliebenen Elemente Deiner Wörterliste und vergleichst die Endung beider Wörter:
Code: Alles auswählen
while words:
first = words.pop()
for second in words:
if first[-3:] == second[-3:]:
reim.add(first)
reim.add(second)
`reim` sollte auch ein Set sein, da Du ansonsten evtl. Duplikate einträgst.
Im Grunde war es das dann auch schon.
Zu Deinem Code fällt mir noch folgendes auf:
- Du schreibst `print` im Code wie eine Funktion, benutzt aber offensichtlich (`raw_input`!) Python 2.x. Das solltest Du nicht tun! `print` ist da ein Statement und die runden Klammern haben da nichts zu suchen. Woher hast Du das?
- Du importierst `string`, ohne das Modul zu nutzen. Du kannst so etwas mittels des Tools `pyflakes` herausfinden:
Code: Alles auswählen
nelson@destiny ~/src/Python/forum/reim % pyflakes reim.py
reim.py:1: 'string' imported but unused
Generell solltest Du nur Module importieren, die Du auch nutzt.
- Du kannst Aufrufe schachteln:
Code: Alles auswählen
text = text.replace(".", "")
text = text.replace(",", "")
text = text.replace("!", "")
text = text.replace("?", "")
text = text.split()
kann man vereinfachen zu:
Oder aber noch besser, eine Schleife benutzen:
Code: Alles auswählen
In [20]: text = "Hallo, Welt!"
In [21]: for char in ".,?!":
text = text.replace(char, "")
....:
In [22]: text
Out[22]: 'Hallo Welt'
- Namen sollten nicht ständig für andere Objekte benutzt werden. `text` ist bei Dir erst ein String, dann eine Liste... das ist nicht wirklich gut, da es das Lesen des Codes erschwert. Mein `words` sagt da doch viel eher aus, dass es sich um eine Wort-Liste handelt, oder?
Generell ist das Eingeben eines langen Textes per `raw_input` so eine Sache... wieso versuchst Du nicht, den Text per Kommandozeilenparameter aus einer Datei oder noch besser aus `sys.stdin` zu lesen? Aber zunächst solltest Du Dein Script debuggen und verbessern. Dazu kann man ruhig mal einen statischen Text im Programm selber platzieren!
