Liste auf mehrere Sparten verteilen

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
Dark Shadow
User
Beiträge: 38
Registriert: Samstag 23. April 2011, 15:49

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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]]}
In specifications, Murphy's Law supersedes Ohm's.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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]]}
In specifications, Murphy's Law supersedes Ohm's.
Dark Shadow
User
Beiträge: 38
Registriert: Samstag 23. April 2011, 15:49

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
Antworten