Seite 1 von 1

Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 14:17
von Dingels
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

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 14:58
von hendrikS
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.

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 15:30
von Dingels
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?

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 15:47
von hendrikS
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.

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 16:07
von 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')

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 16:13
von hendrikS
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")

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 16:27
von BlackJack
@hendrikS: Bitte mit Warnung dass man das nicht verwenden sollte. Was war das Ziel? Unnötiges kopieren von Elementen zu maximieren!? ;-)

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 16:35
von hendrikS
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.

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Sonntag 5. Dezember 2010, 21:56
von pillmuncher
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, [])

Re: Liste in mehrere Unterlisten splitten?

Verfasst: Mittwoch 8. Dezember 2010, 16:19
von Dingels
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