Seite 1 von 1

Listen splitten

Verfasst: Dienstag 23. Februar 2010, 10:09
von frabron
Hallo,

ich suche einen Weg, um eine Liste in Unterlisten oder -mengen zu unterteilen, bzw. zu splitten.

Hintergrund: Ich reiche die Liste an ein Shellprogramm weiter, dieses kommt aber bei grossen Listen aus dem Tritt, deshalb würde ich gerne die Listen kleiner machen, bzw. über Untermengen der Liste iterieren.

Mein bisheriger Code funktioniert zwar, ist aber sicherlich nicht optimal. Gibt es da ein Modul, dass diese Funktionalität bietet?

Beispiel:

Code: Alles auswählen

a = range(87)
length = len(a)
start = 0
end = 10
step = 10

while True:
    print " ".join(["%2i" % num for num in a[start:end]])
    start = end
    end = end + step

    if end >= length:
        print " ".join(["%2i" % num for num in a[start:end]])
        break

Verfasst: Dienstag 23. Februar 2010, 10:20
von CM

Code: Alles auswählen

from itertools import izip
def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)
aus http://docs.python.org/library/itertools.html

Re: Listen splitten

Verfasst: Dienstag 23. Februar 2010, 12:53
von mkesper
frabron hat geschrieben:Hintergrund: Ich reiche die Liste an ein Shellprogramm weiter, dieses kommt aber bei grossen Listen aus dem Tritt
Dann willst du evtl xargsbenützen.

Verfasst: Dienstag 23. Februar 2010, 15:47
von frabron
Danke für den Code. Da wäre ich so nie drauf gekommen, obwohl ich den Itertools schon gesucht hatte. Leider ist meine Python Version 2.5, und izip_longest() gibt's erst ab 2.6 :(

Danke für den Hinweis mit xargs. Ich arbeite zwar unter Windows, aber in meiner Softwareinstallation (msys) ist in der Tat eine xargs Umsetzung mit drin. Ich schiebs mal auf die Todo-Liste :)

Verfasst: Dienstag 23. Februar 2010, 20:27
von CM
Also, entweder updaten oder den Code von der itertools-Seite kopieren. Das Schöne ist nämlich: Bei vielen Funktionen steht dran, wie sie implementiert sind / man sie implementieren könnte ;-) . Toll, oder?

Verfasst: Mittwoch 24. Februar 2010, 07:48
von frabron
Ah, das meint das Codegewusel in dem Abschnitt ;)

Hab den Abschnitt in den Docs nur kurz überflogen, mehr liess die Zeit gestern leider nicht zu. Aber danke für den Tipp/ die Bestätigung. Jetzt muss ich nur noch die Zeit finden, den Schnipsel mal nachzuvollziehen. Einfach C&P widerstrebt mir, ich muss immer alles verstehen wollen.

Updaten ist leider nicht. Das 2.5er Python ist Bestandteil von einem Softwarepaket, und ich will mir bei Updates nicht mehr Arbeit machen als nötig.

Gruss & Danke

Frank

Verfasst: Mittwoch 24. Februar 2010, 10:44
von snafu
Implementiert sind sie in C. In der Doku steht nur Python-Code, der zum selben Ergebnis führt, allerdings natürlich langsamer ist. Man sieht ja am Beispiel von dotproduct() (ganz unten), dass man noch etwas weiter optimieren könnte, dann allerdings nicht mehr so schönen Python-Code hat. Wie immer ein Spagat zwischen Lesbarkeit und Geschwindigkeit, d.h. meist abhängig vom konkreten Anwendungsfall.