Anwendung von Sets bringt Reihenfolge durcheinander

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
DetRRG
User
Beiträge: 2
Registriert: Samstag 28. Mai 2011, 17:11

Hallo zusammen,

Ich habe folgenden Programmcode geschrieben:

import nltk
nltk.download()
from nltk.corpus import stopwords
stopwords = stopwords.words('english')
newstopwords = set(stopwords)
porter = nltk.PorterStemmer()
eingabe = 'all the books are lying on the tables each and every single day'
listeingabe = eingabe.split(" ")
seteingabe = set(listeingabe)
print seteingabe
newgesamtliste = seteingabe - newstopwords
print newgesamtliste
listgesamtliste = list(newgesamtliste)
print listgesamtliste
porterstem = [porter.stem(t) for t in listgesamtliste]
print porterstem

Ich nutze hier das ntlk und importiere zunächst das nltk und dann importiere ich eine Liste Englischer Stoppworte. Das Ziel war, dass die Stoppworte aus eingabe abgezogen werden. Wie sich aber zeigte lässt sich das nicht mit Hilfe von Listen realisieren sondern ich muss die Listen in Sets umwandeln. Wenn ich aber die Liste von Eingabe in ein Set umwandel, damit ich dann das Set von Stoppworte davon abziehen kann, dann geht die Reihenfolge von listeingabe verloren und die Worte aus Eingabe erscheinen in seteingabe in einer seltsam zufälligen Reihenfolge.

Es ist aber sehr wichtig, dass die Worte in listgesamtliste auf die dann der Porter-Stemmer angewandt wird in der gleichen Reihenfolge ist, wie in Eingabe nur eben um die Stoppworte bereinigt.

Kann mir einer von euch vielleicht einen Tipp geben, wie ich das schaffen kann?

Herzlichen Dank für eure Hilfe. Ich bin mir auch sicher, dass der Code noch verbessert werden kann, das werde ich auch noch tun.

Viele Grüße,

DetRRG
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum!

Nun ein Set ist nunmal eine mathematische Menge und damit inhaerent ungeordnet.
Du kannst aber folgendes machen:

Code: Alles auswählen

eingabe = 'all the books are lying on the tables each and every single day'
listeingabe = eingabe.split(" ")
unique = []
seen = set()
for x in listeingabe:
    if x not in seen:
        unique.append(x)
        seen.add(x)
Und benutze in Zukunft bitte `python`-Tags.

Edit: Noch ein wenig Code-Kritik: Du solltest nicht den Typ eines Objekts in den Namen kodieren, an den du das Objekt bindest. Ein Namen hat keinen Typ sondern nur das Objekt und damit kann dann eine `listeingabe` zum Beispiel eine Zahl werden.
DetRRG
User
Beiträge: 2
Registriert: Samstag 28. Mai 2011, 17:11

Hallo cofi,

vielen Dank, dass du mich so nett willkommen geheißen hast und mir geholfen hast. Ich habe den Code, so wie du ihn beschrieben hast in meinen Code eingebaut aber leider ist das set immernoch ungeordnet.

Ich nehme mal an, ich mache etwas falsch und stehe einfach nur auch dem Schlauch. Ich habe dort, wo die Sets voneinander abgezogen werden sollen seen eingesetzt, weil das ja in dem Code auch als neues set definiert worden ist, aber wenn ich es nun von dem Stoppwort-Set abziehe, dann passiert das gleiche wie zuvor.

Weißt du vielleicht was ich falsch mache? Hier ist mein Code:

Code: Alles auswählen

[code=python] eingabe = 'all the books are lying on the tables each and every single day'
leingabe = eingabe.split(" ")
unique = []
print unique
seen = set()
for x in leingabe:
    if x not in seen:
        unique.append(x)
        seen.add(x)
newgesamt = seen - newstopwords 
[/code]

Irgendwie klappt es mit der Verwendung der Python-Tags auch nicht. Ich bin ratlos und es tut mir sehr leid.

Herzlichen Dank für die Mühe und noch einen schönen Abend!

DetRRG
BlackJack

@DetRRG: `set`\s sind immer ungeordnet. Du kannst das Problem also nicht durch das Abziehen von `set`\s voneinander lösen. Eine Alternative Lösung hast Du ja bekommen. Die musst Du jetzt nur noch nachvollziehen und verstehen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

DetRRG hat geschrieben:Irgendwie klappt es mit der Verwendung der Python-Tags auch nicht. Ich bin ratlos und es tut mir sehr leid.
Kein

Code: Alles auswählen

[code=python ].. sondern nur das 2. Innerhalb eines [code ][/code ] Paares wird jeglicher Text[1] nicht interpretiert.

Den Rest hat dir ja schon BlackJack erklaert.

[1] Bis auf `&' .. warum auch immer.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

wie wäre es mit

Code: Alles auswählen

meine_liste = sorted(seen)
?
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mkesper: Es geht hier um das Einhalten einer Reihenfolge in der Form, wie sie bei der Eingabe der Daten genutzt wurde. Das muss nicht zwangsläufig alphabetisch sein (bzw den Kriterien unterliegen, die von `sorted()` angewendet werden).
Antworten