Verschachtelte List Comprehension?

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
Joshuah992
User
Beiträge: 16
Registriert: Samstag 3. März 2018, 13:27

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.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du es einfach mal probiert?

x = [(i, j) for i in range(10) for j in range(20)]
Joshuah992
User
Beiträge: 16
Registriert: Samstag 3. März 2018, 13:27

Oh mann -.- da war ja was...
Okay, vielen Dank mal wieder. Ich schätze, jetzt komme ich klar :roll:
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
Joshuah992
User
Beiträge: 16
Registriert: Samstag 3. März 2018, 13:27

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.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mein Code hat ja auch nur illustriert wir man list comprehensions schachtelt. Du darfst da schon deine eigenen Code reinschnörkeln.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1016
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Joshuah992
User
Beiträge: 16
Registriert: Samstag 3. März 2018, 13:27

Gut, alles klar ^.^ Vielen Dank euch!
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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.
Antworten