Unvollständige Liste ...

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
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

Hallo ihr Lieben,

ich habe folgende Funktion erstellt:

Code: Alles auswählen

def ErstelleListe(filename, n):
	a = open(filename)
	b = a.read()
	for i in b:
		c = b.split()
		ergebnis = [c[0:n]]
	return ergebnis
folgendes wird mir ausgegeben:

Code: Alles auswählen

>>> 
[['Das', 'ist']]
eigentlich möchte ich das: [['Das', 'ist'], ['ist', 'ein'], ['ein', 'Test']]

Der Funktion wird eine Textdatei gegeben, woraus eine Liste von Listen der in der Datei enthaltenen Wörter erstellt werden soll. "n" bezeichnet die Menge, der in einer Liste enthaltenen Wörter.
Die Textdatei beinhaltet erstmal nur zum testen diesen Satz: "Das ist ein Test"
Wie krieg ich das alles ausgegeben...? Irgendwas scheint ja in der Funktion noch zu fehlen.

Wenn n = 3 :
[['Das', 'ist', 'ein'], ['ist', 'ein', 'Test']]
Zuletzt geändert von Denkow am Donnerstag 10. Januar 2013, 19:43, insgesamt 1-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Voilà:

Code: Alles auswählen

>>> filecontent = "Das ist ein Test"
>>> x = filecontent.split()
>>> zip(x, x[1:])
[('Das', 'ist'), ('ist', 'ein'), ('ein', 'Test')]
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

@derdon: das ist leider nicht das, was ich brauche :(
weil --> wenn n = 3 :
[['Das', 'ist', 'ein'], ['ist', 'ein', 'Test']]
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Meinst du das hier?

Code: Alles auswählen

In [40]: txt = "Dies ist ein ziemlich langer Test Text".split()

In [41]: zip(*[iter(txt[i:]) for i in xrange(3)])
Out[41]: 
[('Dies', 'ist', 'ein'),
 ('ist', 'ein', 'ziemlich'),
 ('ein', 'ziemlich', 'langer'),
 ('ziemlich', 'langer', 'Test'),
 ('langer', 'Test', 'Text')]
:wink:
yipyip
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

@ yipyip: ja genau sowas, vielen dank :)
allerdings bekomm ich die einzelnen listen innerhalb der liste als tupel ausgegeben....ich möchte sie jedoch ebenfalls als liste [] ausgegeben bekommen. wie krieg ich das noch hin? :K
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Das ahnte ich...
Versuchs mal mit map(list, ...)
:wink:
yipyip
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

yipyip hat geschrieben:Versuchs mal mit map(list, ...)
öhm...wie genau soll das dann aussehen? :K

aber an sich ist meine funktion richtig, oder?
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Code: Alles auswählen

In [47]: ls = [(1, 2), (3, 4)]

In [48]: map(list, ls)
Out[48]: [[1, 2], [3, 4]]
Also verwende deine Liste mit den Tupeln fuer 'ls'.
:wink:
yipyip
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Denkow hat geschrieben:öhm...wie genau soll das dann aussehen? :K
map

Code: Alles auswählen

data = [('Dies', 'ist', 'ein'),
        ('ist', 'ein', 'ziemlich'),
        ('ein', 'ziemlich', 'langer'),
        ('ziemlich', 'langer', 'Test'),
        ('langer', 'Test', 'Text')]

print map(list, data)
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

ahhhh so ähnlich hatte ich es, aber mir war irgendwie nicht klar, dass list und die variable nur mit komma getrennt in einer klammer stehen müssen....hab da noch mit klammern rumhantiert :lol:

VIELEN DANK :D es funktioniert!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Denkow hat geschrieben:ahhhh so ähnlich hatte ich es, aber mir war irgendwie nicht klar, dass list und die variable nur mit komma getrennt in einer klammer stehen müssen....hab da noch mit klammern rumhantiert :lol:
Das ist ein ganz normaler Funktionsaufruf und die Argumente bei einem Funktionsaufruf werden einfach mit Komma getrennt.

Wichtig ist das Verständnis dessen, was map macht. map wendet die übergebene Funktion (Parameter 1) auf jedes Element des übergebenen Iterables (Parameter 2) an und liefert eine Liste zurück. Hier wird also auf jedes Tupel (Listenelement) die Funktion list angewendet und schon ist die Umwandlung passiert.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

/me hat geschrieben:Wichtig ist das Verständnis dessen, was map macht. map wendet die übergebene Funktion (Parameter 1) auf jedes Element des übergebenen Iterables (Parameter 2) an und liefert eine Liste zurück. Hier wird also auf jedes Tupel (Listenelement) die Funktion list angewendet und schon ist die Umwandlung passiert.
würde ich also ein liste in tuple umwandeln wollen, könnte ich es folgendermaßen schreiben: map(tuple, xy)...richtig?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Denkow hat geschrieben:würde ich also ein liste in tuple umwandeln wollen, könnte ich es folgendermaßen schreiben: map(tuple, xy)...richtig?
Probiere es aus. Das geht schneller als hier auf eine Antwort zu warten (die übrigens "Ja" lautet).

Du wandelst damit alle Elemente in ein Tupel um.

Du kannst map auch eigene Funktionen übergeben.

Code: Alles auswählen

>>> data = [1, 2, 3, 4, 5]
>>> def quad(x):
	return x**2

>>> result = map(quad, data)
>>> print result
[1, 4, 9, 16, 25]
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

Da hast du wohl recht. Vielen Dank :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Stichworte: Digram, Trigram und N-gram. Und wenn du schon da bist, wirst du wohl Interesse an NLTK haben, das bringt direkt Implementierungen mit.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich würde `map()` ja nicht benutzen, wenn ich darauf baue, dass auf jeden Fall eine Liste zurückgeliefert wird. Dieses Verhalten ist zwar dokumentiert, wurde aber in Python 3 dahingehend geändert, dass `map()` nun einen Iterator zurückgibt. Auf Iteratoren sind z.B. keine Indexzugriffe oder Abfragen der Länge möglich (zumindest nicht ohne "Umwege"). Ich empfehle für solche Fälle eine List Comprehension.

Das könnte dann so aussehen:

Code: Alles auswählen

def take_words(filename, n):
    with open(filename) as f:
        return [line.split()[:n] for line in f]
Antworten