Seite 1 von 1

Liste auf mehrere Sparten verteilen

Verfasst: Samstag 25. Juni 2011, 23:03
von Dark Shadow
Hallo Community!
Ich stehe wieder mal vor einem Problem, bei dem mir dieses Mal auch vieles Nachdenken nicht geholfen hat. Mittlerweile habe ich selbst keinen richtigen Durchblick mehr bzw. stehe auf dem Schlauch. Mein Problem sieht wie folgt aus:

Man hat eine zufällige Liste bestehend aus einer ungewissen Zahl von Elementen. Jetzt möchte ich diese Elemente so verteilen, dass sie wie "Seiten" aussehen (die mit einer maximalen Elementzahl bestimmt werden), zum Beispiel:

Code: Alles auswählen

liste = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9]]
Ausgabe: {"1": [[1, 2], [2, 3], [3, 4]], "2": [[4, 5], [5, 6], [6, 7]], "3": [[7, 8], [8, 9]]}
Ich hoffe, jemand versteht mein Problem und weiß zufällig einen Rat,
Dark Shadow

P.S.: Ich brauche das für TkTable, weshalb ich die Daten nicht als großes Paket haben möchte, sondern zum Durchschalten, da ich die Fenstergröße oder ähnliches gleich bleibend möchte.

Re: Liste auf mehrere Sparten verteilen

Verfasst: Samstag 25. Juni 2011, 23:38
von pillmuncher
Für Python 2.7:

Code: Alles auswählen

>>> from itertools import izip_longest
>>>
>>> liste = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9]]
>>>
>>> {str(i):[e for e in es if e] for i, es in enumerate(izip_longest(*[iter(liste)] * 3), 1)}
{'1': [[1, 2], [2, 3], [3, 4]], '3': [[7, 8], [8, 9]], '2': [[4, 5], [5, 6], [6, 7]]}

Re: Liste auf mehrere Sparten verteilen

Verfasst: Samstag 25. Juni 2011, 23:50
von EyDu
Mit Kopien des Iterators zu arbeiten ist natürlich schon sehr magisch. Die LC könnte man noch mit `filter(bool, es)` vereinfachen.

@Dark Shadow: Zeit doch mal ein wenig von deinen Versuchen, so ganz verkehrt können die ja nicht sein. Man muss es auch nicht so machen wie pillmuncher, einfache Anweisungen tun es auch.

Re: Liste auf mehrere Sparten verteilen

Verfasst: Sonntag 26. Juni 2011, 00:22
von pillmuncher
EyDu hat geschrieben:[...] einfache Anweisungen tun es auch.
Meinst du vielleicht sowas:

Code: Alles auswählen

>>> result = {}
>>>
>>> for i in xrange(len(liste) / 3 + 1):
...     result[str(i+1)] = liste[i*3:i*3+3]
...
>>> result
{'1': [[1, 2], [2, 3], [3, 4]], '3': [[7, 8], [8, 9]], '2': [[4, 5], [5, 6], [6, 7]]}

Re: Liste auf mehrere Sparten verteilen

Verfasst: Sonntag 26. Juni 2011, 08:04
von Dark Shadow
Vielen Dank für Eure schnellen Antworten. Die zweite Möglichkeit von pillmuncher scheint mir recht gut und verständlich zu sein. Danke!

@EyDu: Die Möglichkeiten funktionieren nicht, weil ich sie nicht richtig umsetzen konnte. Hier mal ein Versuch bei dem ich versucht habe, das Ganze mit Modulos und der Gesamtzahl der Werte zu lösen. Ich konnte es nicht ganz richtig umsetzen, allerdings werde ich jetzt die zweite Möglichkeit von pillmuncher verwenden.

Code: Alles auswählen

ges = len(liste)
wert = 3
zeile = 1
seite = dict()
zeilen = dict()
seit_ = 1
for x in liste: 
    if zeile == wert: 
        zeile = 1
        seite[str(seit_)] = zeilen
        zeilen = dict()
        seit_ += 1
        ges -= wert
        if ges % wert != 0: 
            wert = ges%wert
    
    zeilen[str(zeile)] = x
    zeile += 1
Ich bedanke mich wieder für Eure Schnelligkeit und Kompetenz.
Dark Shadow