Teilstring am Anfang des Textes suchen

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

@Nobuddy: Dann kann man das nicht mehr ganz so kompakt schreiben. Es würde sich eine „list comprehension” (LC) anbieten, oder man erstellt sich eine Funktion mit `operator.itemgetter()` um die Elemente von `r` abzufragen.

Code: Alles auswählen

artikelneu = (
    [r[i] for i in [0, 1, 4, 25]]
    # ...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Manchmal ist der einfachste Weg auch der kürzeste:

Code: Alles auswählen

[r[i] for i in [0, 1, 4, 25]]
vs.
[r[0], r[1], r[4], r[25]]
Stefan
BlackJack

@sma: Wobei man nicht immer den kürzesten wählen sollte. Ist hier Geschmackssache, aber ich finde den Namen `r` nicht wiederholen zu müssen und die Indizes als einen Teilausdruck einfach herausziehen zu können schöner. Zumal das mit dem Kürzer schnell kippen kann wenn man einen längeren Bezeichner verwendet und/oder die Liste der Indizes länger wird.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Es ist aber für einen Anfänger viel leichter zu verstehen, selbst wenn der Ausdruck durch einen längeren (besseren) Variablennamen doch länger wird.

Stefan
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,
das von sma sieht auf den ersten Blick einfacher aus, aber das von BlackJack ist eigentlich auch nicht schwer zu verstehen.

Hatte zwar zuerst das Problem, wie der Eintrag in der zweiten for-Schleife auszusehen hat.
Habe es zuerst mit 'for r in my_reader(infile)' dann mit 'for i in my_reader(infile)' versucht, was ja eigentlich Quatsch ist.
Bis ich dann da drauf kam.

Code: Alles auswählen

        artikelneu = (
            [r[i] for i in [0, 1, 4, 5, 25]]
            for r in my_reader(infile)
            if tuple(r[:2]) not in artikelvergleich
        )
Zum Verständnis!
Ist meine Annahme richtig, daß die Spaltendefinition von '[r for i in [0, 1, 4, 5, 25]]' in 'my_reader(infile)' übernommen wird?

Grüße Nobuddy
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nobuddy hat geschrieben:

Code: Alles auswählen

        artikelneu = (
            [r[i] for i in [0, 1, 4, 5, 25]]
            for r in my_reader(infile)
            if tuple(r[:2]) not in artikelvergleich
        )
Zum Verständnis!
Ist meine Annahme richtig, daß die Spaltendefinition von '[r for i in [0, 1, 4, 5, 25]]' in 'my_reader(infile)' übernommen wird?

Also der Ablauf ist: `for`-Schleife über das Ergebnis von `my_reader(infile)`, wobei pro Iteration `r` neu gebunden wird. Danach wird die Bedingung aus der letzten Zeile für das jeweilige `r` überprüft und abhängig davon schließlich das `r` innerhalb der oberen Zeile benutzt, wo der Zugriff über den Index gemacht wird. Trifft die Bedingung für ein `r` in der letzten Zeile nicht zu, dann wird die LC in der ersten Zeile garnicht erst betreten.
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Hi,

ohne alles genau gelesen zu haben eine spontane Idee. Wenn die Daten sehr, sehr groß sind, könnte man es doch womöglich beschleunigen, wenn man die zu bearbeitenden Listen aufteilt und mit Rekursion untersucht. :K

AlphaX2
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

sma hat geschrieben:

Code: Alles auswählen

[r[i] for i in [0, 1, 4, 25]]
vs.
[r[0], r[1], r[4], r[25]]
vs.

Code: Alles auswählen

from operator import itemgetter
items = itemgetter(0, 1, 4, 25)
...
items(r)
Ist halt ein Tupel statt einer Liste.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oder halt als Einzeiler:

Code: Alles auswählen

items = itemgetter(0, 1, 4, 25)(r)
Ist IMHO auch recht elegant gelöst damit.
BlackJack

@snafu: Naja, `itemgetter()` erstellt dabei jedesmal ein neues Funktionsobjekt das nach einmal benutzen wieder verworfen wird. Aber alle diese Objekte machen das gleiche.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@BlackJack: Ja, ist aber Geschmackssache, ob man das jetzt wirklich so schrecklich findet. Performancemäßig dürfte der Unterschied nicht auffallen. Wenn man wollte, könnte man bei deiner Lösung ja auch die Zahlenfolge cachen, damit nicht jedes Mal eine neue Liste angelegt wird. :o ;)
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,
Danke für die vielen Infos und auch snafu, für die Erklärung.

Für den Anfang, bin ich wieder ein Schrittchen weiter, verdaue das stückchenweise ... :wink:

Grüße Nobuddy
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

AlphaX2 hat geschrieben:ohne alles genau gelesen zu haben eine spontane Idee. Wenn die Daten sehr, sehr groß sind, könnte man es doch womöglich beschleunigen, wenn man die zu bearbeitenden Listen aufteilt und mit Rekursion untersucht. :K
Wieso sollte das schneller sein? Wenn die Daten sehr groß sind, wird dein Stack sehr groß und irgendwann fliegst du in Python gegen das Rekursionslimit, also gerade für große Datenmengen ist Rekusion (in Python natürlich) nicht das Mittel der Wahl.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten