Seite 1 von 1

Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 19:38
von Denkow
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']]

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 19:42
von derdon
Voilà:

Code: Alles auswählen

>>> filecontent = "Das ist ein Test"
>>> x = filecontent.split()
>>> zip(x, x[1:])
[('Das', 'ist'), ('ist', 'ein'), ('ein', 'Test')]

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 19:49
von Denkow
@derdon: das ist leider nicht das, was ich brauche :(
weil --> wenn n = 3 :
[['Das', 'ist', 'ein'], ['ist', 'ein', 'Test']]

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 19:59
von yipyip
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

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 20:07
von Denkow
@ 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

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 20:09
von yipyip
Das ahnte ich...
Versuchs mal mit map(list, ...)
:wink:
yipyip

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 20:16
von Denkow
yipyip hat geschrieben:Versuchs mal mit map(list, ...)
öhm...wie genau soll das dann aussehen? :K

aber an sich ist meine funktion richtig, oder?

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 20:22
von yipyip

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

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 20:24
von /me
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)

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 20:29
von Denkow
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!

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 20:49
von /me
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.

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 20:59
von Denkow
/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?

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 21:01
von /me
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]

Re: Unvollständige Liste ...

Verfasst: Donnerstag 10. Januar 2013, 21:06
von Denkow
Da hast du wohl recht. Vielen Dank :)

Re: Unvollständige Liste ...

Verfasst: Freitag 11. Januar 2013, 00:47
von cofi
Stichworte: Digram, Trigram und N-gram. Und wenn du schon da bist, wirst du wohl Interesse an NLTK haben, das bringt direkt Implementierungen mit.

Re: Unvollständige Liste ...

Verfasst: Freitag 11. Januar 2013, 09:21
von snafu
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]