Seite 1 von 1

Verschachtelte List Comprehension?

Verfasst: Montag 23. April 2018, 21:25
von Joshuah992
Hi Leute^^

Ich schreibe grade ein "Textanalyse-Werkzeug", und der erste Algorithmus überführt eine gewöhnliche Textdatei in eine Liste, die einfach
den Text darstellt - nur als Liste von Strings, die einfach die (gelowerten) Wörter enthält.

Der Code dazu ist der folgende:

Code: Alles auswählen

with open("text.txt", "r") as file:
    line_list = [line.split() for line in file]

word_list = []

for line in line_list:
    for word in line:
        word_list.append( (word.strip(" ,.;:?'\"<>%*+-/=_~!§$&(){}[]#")).lower() )
Ich würde die Zeilen 4-8 gern in eine packen, mit einer verschachtelten List-Comprehension. Aber ich muss nach einer längeren Zeit des Kopfzerbrechens und Nachforschung in der Dokumentation und meinem Buch leider feststellen, dass ich (bislang) keinen Weg gefunden habe. Ich frage mich gerade, ob das generell geht. Ich dachte, mal stumpf nachfragen schadet evtl nicht, ehe ich mich im Kreis drehe.

Re: Verschachtelte List Comprehension?

Verfasst: Montag 23. April 2018, 21:30
von __deets__
Hast du es einfach mal probiert?

x = [(i, j) for i in range(10) for j in range(20)]

Re: Verschachtelte List Comprehension?

Verfasst: Montag 23. April 2018, 21:40
von Joshuah992
Oh mann -.- da war ja was...
Okay, vielen Dank mal wieder. Ich schätze, jetzt komme ich klar :roll:

Re: Verschachtelte List Comprehension?

Verfasst: Montag 23. April 2018, 23:24
von snafu

Code: Alles auswählen

import re
import sys

def get_words(lines):
    return [re.findall('\w+', line) for line in lines]

def main():
    with open(sys.argv[1]) as f:
        print(get_words(f))

if __name__ == '__main__':
    main()
Wobei hier der Dateiname als erstes Argument beim Ausführen von der Kommandozeile übergeben werden muss.

Re: Verschachtelte List Comprehension?

Verfasst: Dienstag 24. April 2018, 08:05
von Sirius3
@snafu: Du spaltest die Wörter an anderen Stellen als der OP. Außerdem lieferst Du eine verschachtelte Liste.

Das hier wäre (fast) äquivalent:

Code: Alles auswählen

import re
import sys
 
def get_words(filename):
    with open(filename) as f:
        return re.split("\W*\s+\W*", f.read())
 
def main():
    word_list = get_words("text.txt")
 
if __name__ == '__main__':
    main()

Re: Verschachtelte List Comprehension?

Verfasst: Dienstag 24. April 2018, 10:38
von Joshuah992
Hi!

Wow, das sind echt interessante Codebeispiele o.O. Es fühlt sich für mich aber irgendwie besser an, Dinge wo es geht ohne externe Bibliotheken zu regeln, und sie nur dann einzusetzen, wo man damit echt Code sparen kann. Vielleicht ist das auch falsch, man kann mich da gerne belehren^.^

@__deets__, dein Code gibt eine Liste von Tupeln zurück, das war eigentlich nicht mein Ziel, aber trotzdem echt interessant, dass das so funktioniert.

Re: Verschachtelte List Comprehension?

Verfasst: Dienstag 24. April 2018, 10:39
von __deets__
Mein Code hat ja auch nur illustriert wir man list comprehensions schachtelt. Du darfst da schon deine eigenen Code reinschnörkeln.

Re: Verschachtelte List Comprehension?

Verfasst: Dienstag 24. April 2018, 12:14
von DeaD_EyE
Hier mal mit anderen Variablen:

Code: Alles auswählen

outer_loop = [10, 20, 30]
inner_loop = ['a', 'b', 'c']

result = [(outer, inner) for outer in outer_loop for inner in inner_loop]

Code: Alles auswählen

[(10, 'a'),
 (10, 'b'),
 (10, 'c'),
 (20, 'a'),
 (20, 'b'),
 (20, 'c'),
 (30, 'a'),
 (30, 'b'),
 (30, 'c')]
Die Verschachtelung der Comprehension fängt außen an (kommt als erstes) und danach die inneren Schleifen. Also man kann, wenn man möchte, weiter verschachteln, sofern es noch lesbar und sinnvoll ist.

Re: Verschachtelte List Comprehension?

Verfasst: Dienstag 24. April 2018, 13:35
von Joshuah992
Gut, alles klar ^.^ Vielen Dank euch!

Re: Verschachtelte List Comprehension?

Verfasst: Dienstag 24. April 2018, 17:19
von nezzcarth
Joshuah992 hat geschrieben:Es fühlt sich für mich aber irgendwie besser an, Dinge wo es geht ohne externe Bibliotheken zu regeln, und sie nur dann einzusetzen, wo man damit echt Code sparen kann. Vielleicht ist das auch falsch, man kann mich da gerne belehren^.^
Na ja, die Standardbibliothek ist ja bei Python dabei und meiner Meinung nach schon eine der großen Stärken dieser Sprache. Ich würde die Funktionalität in diesen Bibliotheken auch nicht als extern ansehen, sondern sozusagen eher als "deaktivierte Features". In den Code-Beispielen sind -- wenn ich nichts übersehen habe -- nur 'sys' und 're' enthalten. Beide stellen in dem Fall Dinge bereit, die anders nicht möglich wären (Einlesen von Kommandozeilen Parametern, bzw. reguläre Ausdrücke). Wenn, dann wäre hier eher die Frage, ob reguläre Ausdrücke als Mittel gegenüber einfachen Stringfunktionen hier angebracht sind (m.M.n. sind sie das). Umgekehrt listest du in deiner letzten Zeile diverse Sonderzeichen auf, statt einfach 'string.punctuation' zu nehmen (und notfalls halt noch '§' und ' ' zu ergänzen), was m.M.n. weniger Arbeit und lesbarer wäre.