Liste in mehrere Unterlisten 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
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Hallo liebe Python-Experten,

ich stehe vor einem vermutlich recht simplen Problem, aber ich finde irgendwie keine Lösung. Vielleicht habt ihr eine Idee. Es geht darum, dass ich eine Liste mit folgendem Inhalt habe:

Code: Alles auswählen

["###category", "This", "is", "a", "sentence", "###category", "This", "is", "another", "sentence", ...]
Daraus möchte ich jetzt eine Liste mit mehreren Unterlisten erstellen, und zwar so:

Code: Alles auswählen

[["###category", "This", "is", "a", "sentence"], ["###category", "This", "is", "another", "sentence"], ...]
Wie stelle ich sowas an? Könnt ihr mir helfen?

Herzlichen Dank im Voraus und euch allen noch einen schönen Sonntag! :)

Beste Grüße,
Dingels
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Hier gibts Tips wie man es machen könnte.
Aber du willst sicher selbst eine Lösung finden. Also slicing ist eine gute Idee.

Edit: Ich mußte das Thema erstmal finden. Also ich finde die Suchfunktion des Forums ist recht bescheiden. Na ja sei's drum.
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Hallo Hendrik,

danke für deine Antwort. In dem Thread, den Du verlinkt hast, geht es darum, wie man ein Tuple in mehrere gleich große Untertuple aufteilt. Bei mir ist aber das Problem, dass die Unterlisten unterschiedlich groß sein können. Sobald ein Marker der Form ###category auftaucht, soll eine neue Liste beginnen und die alte Liste geschlossen werden, sozusagen.

Ich werde mir dennoch in dem Thread mal ne Inspiration holen. Hat jemand vielleicht noch einen weiteren Tip für mich?
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Die Lösungen im Link passen nicht 100% zu Deinem Problem. Es ist aber auch nicht mehr weit bis dahin. Du verwendest am besten ausserdem die index Methode um "###category" zu finden.
BlackJack

Es sind zwar ein paar Zeilen, aber eigentlich ist so eine Lösung doch naheliegend, wenn man mal aufschreibt, wie man das Schrittweise machen würde:

Code: Alles auswählen

def group(iterable, marker):
    result = list()
    sublist = None
    for item in iterable:
        if item == marker:
            if sublist is not None:
                result.append(sublist)
            sublist = [item]
        else:
            sublist.append(item)
    if sublist is not None:
        result.append(sublist)
    return result


def main():
    data = ['###category', 'This', 'is', 'a', 'sentence',
            '###category', 'This', 'is', 'another', 'sentence', '...']
    print group(data, '###category')
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Will auch noch schnell meine Lösung zum besten geben.

Code: Alles auswählen

def take(a,n):
    return a[:n]

def drop(a,n):
    return a[n:]

def group(a,s):
    a.pop(0)
    if s in a:
        i = a.index(s)
        return [[s]+take(a,i)] + group(drop(a,i),s)
    else:
        return [[s]+a]

a = ["###category", "This", "is", "a", "sentence", "###category", "This", "is", "another", "sentence","###category", "bla"]

print group(a,"###category")
BlackJack

@hendrikS: Bitte mit Warnung dass man das nicht verwenden sollte. Was war das Ziel? Unnötiges kopieren von Elementen zu maximieren!? ;-)
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

BlackJack hat geschrieben:@hendrikS: Bitte mit Warnung dass man das nicht verwenden sollte. Was war das Ziel? Unnötiges kopieren von Elementen zu maximieren!? ;-)
Rein ergebnisorientierte Lösung.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Mit reduce:

Code: Alles auswählen

def group(iterable, marker):
    def grouper(result, item, marker=marker):
        if item == marker:
            result.append([item])
        else:
            result[-1].append(item)
        return result
    return reduce(grouper, iterable, [])
In specifications, Murphy's Law supersedes Ohm's.
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Hallo an alle,

ich bin erst heute dazu gekommen, mich näher mit dem Problem zu beschäftigen. BlackJacks Ansatz ist für mein Programm am vielversprechendsten. Das werde ich mir direkt mal als Snippet ablegen, weil ich das bestimmt öfter gebrauchen kann.

Auf jeden Fall vielen Dank an euch alle für eure Hilfe. :)

Beste Grüße,
Dingels
Antworten