Seite 1 von 2

Re: Teilstring am Anfang des Textes suchen

Verfasst: Samstag 14. April 2012, 18:25
von 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]]
    # ...

Re: Teilstring am Anfang des Textes suchen

Verfasst: Sonntag 15. April 2012, 08:46
von sma
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

Re: Teilstring am Anfang des Textes suchen

Verfasst: Sonntag 15. April 2012, 09:42
von 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.

Re: Teilstring am Anfang des Textes suchen

Verfasst: Sonntag 15. April 2012, 10:24
von sma
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

Re: Teilstring am Anfang des Textes suchen

Verfasst: Montag 16. April 2012, 12:22
von Nobuddy
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

Re: Teilstring am Anfang des Textes suchen

Verfasst: Montag 16. April 2012, 12:50
von snafu
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.

Re: Teilstring am Anfang des Textes suchen

Verfasst: Montag 16. April 2012, 12:57
von AlphaX2
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

Re: Teilstring am Anfang des Textes suchen

Verfasst: Montag 16. April 2012, 13:46
von pillmuncher
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.

Re: Teilstring am Anfang des Textes suchen

Verfasst: Montag 16. April 2012, 14:03
von snafu
Oder halt als Einzeiler:

Code: Alles auswählen

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

Re: Teilstring am Anfang des Textes suchen

Verfasst: Montag 16. April 2012, 14:18
von BlackJack
@snafu: Naja, `itemgetter()` erstellt dabei jedesmal ein neues Funktionsobjekt das nach einmal benutzen wieder verworfen wird. Aber alle diese Objekte machen das gleiche.

Re: Teilstring am Anfang des Textes suchen

Verfasst: Montag 16. April 2012, 14:31
von snafu
@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 ;)

Re: Teilstring am Anfang des Textes suchen

Verfasst: Montag 16. April 2012, 17:25
von Nobuddy
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

Re: Teilstring am Anfang des Textes suchen

Verfasst: Dienstag 17. April 2012, 01:05
von Leonidas
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.