@Leute
Danke für die Hinweise so weit, die groupby Lösung finde ich schon recht ansprechend, das könnte evtl. so dreissig Zeilen Code bei mir ersetzen (das Beispiel ist natürlich nur eine versimplifizierte Version von dem was ich machen sollte).
Die Sortierung ist nicht unbedingt zwingend, ergibt sich aber eigentlich automatisch durch das ordinale erste Element, dh. 3, 4, 5, ... . Dh. diese Zahlen geben die Reihenfolge vor.
In meiner eigenen Lösung habe ich so etwas wie einen externen und internen Zähler implementiert. Der externe Zähler wird genau dann inkrementiert, wenn der Leit-index sich ändert, also von z.B. 3 auf 4. Und in jedem Schritt wird der innere Index, der die Reihen die zu einem Leit-index gehören anschreibt, um eins erhöht. Auch, damit ich die Zeilen zu einem Index zuordnen kann, sammle ich einelementige Listen der Indeces bevor die Bearbeitung beginnt (siehe 'total_indeces'). Zuerst, und das ist bei mir etwas umständlich, muss ich also eine Liste von Leitindeces erstellen. Dann kommt der beschriebene Algorithmus. M.E. besteht hier die Hauptschwierigkeit darin, dass ich nicht im Voraus weiss, wie viele Element zu einem Leitindex gehören, im Beispiel hat '3' drei Elemente, '4' zwei und '5' wiede drei, können aber beliebig viele sein.
Code: Alles auswählen
a=
magic_list_typecast(
3 14 16 18
3 13 17 18
3 12 17 16
4 12 16 16
4 10 16 13
5 8 15 19
5 6 15 19
5 6 16 18)
# a[0] = 14 16 18
total_indeces = [ 3, 3, 3, 4, 4, 5, 5, 5 ]
unique_list = [ [3], [4], [5] ]
# Cluster elements
tot_cnt = 0
uni_cnt = 0
for ti in total_indeces:
if ti == unique_list[uni_cnt][0]:
unique_indeces[uni_cnt].append(a[tot_cnt])
tot_cnt += 1
else:
uni_cnt += 1
unique_indeces[uni_cnt].append(a[tot_cnt])
tot_cnt += 1
Hat mich schon eine Weile gekostet bis ich darauf kam, das mit zwei Indeces zu machen, ich will aber trotzdem eine Lösung finden die einfacher zu lesen ist, weil ich im Moment selber nicht sicher bin, ob es wirklich immer das machen wird, was ich will.