Python lista de división por palabra clave

Tengo una lista de la siguiente manera:

['MARK_A', 8, 7702.5, 13, 7703, 983472], ['MARK_B', 10, 7702.5, 983472], ['MARK_B', 3, 7703.5, 983472], ['MARK_B', 6, 7701.2, 983472], ['MARK_B', 5, 7704.4, 983472], ['MARK_A', 9, 7701.5, 11, 7704, 983475], ['MARK_B', 10, 7702.5, 983475], ['MARK_B', 3, 7703.5, 983475], ['MARK_B', 6, 7701.2, 983475], ['MARK_B', 5, 7704.4, 983475]] 

¿Cómo es posible dividir esta lista en 2 listas como la siguiente:

 [['MARK_A', 8, 7702.5, 13, 7703, 983472], ['MARK_B', 10, 7702.5, 983472], ['MARK_B', 3, 7703.5, 983472], ['MARK_B', 6, 7701.2, 983472], ['MARK_B', 5, 7704.4, 983472]], [ ['MARK_A', 9, 7701.5, 11, 7704, 983475], ['MARK_B', 10, 7702.5, 983475], ['MARK_B', 3, 7703.5, 983475], ['MARK_B', 6, 7701.2, 983475], ['MARK_B', 5, 7704.4, 983475]] 

Puede haber cualquier número de “MARK_A” en la lista seguido de uno o más “MARK_B”. Estaría dividiendo las listas por el elemento [-1]

Lo uso itertools.groupby para este tipo de problemas (obtuve una colección de colecciones, la itertools.groupby por tokens en colecciones internas)

 from itertools import groupby class GroupbyHelper: def __init__(self, token): self.token = token self.count = 0 def __call__(self, item): self.count += (item[0] == self.token) return self.count grouped_collections = \ [list(grouped) for _, grouped in groupby(collections, GroupbyHelper("MARK_A"))] 

Versión algo generalizada del código anterior:

 from itertools import groupby class GroupbyHelper: def __init__(self, check_token): self.check_token = check_token self.count = 0 def __call__(self, item): self.count += self.check_token(item) return self.count grouped_collections = \ [list(grouped) for _, grouped in groupby(collections, GroupbyHelper(lambda x: x[0] == "MARK_A"))] 

utilizando dos iteradores:

 from itertools import tee, zip_longest iter1, iter2 = tee(i for i, item in enumerate(collections) if item[0] == 'MARK_A') next(iter2) #advance the second iterator so we can move by range grouped_collections = \ [collections[s:e] for s, e in zip_longest(iter1, iter2, fillvalue=len(collections))] 

a veces un plano para bucle no es tan malo:

 grouped_collections = [] for lst in collections: if lst[0]=="MARK_A": grouped_collections.append([lst]) else: grouped_collections[-1].append(lst)