Listen splitten

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
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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 :)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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?
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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