utilizar una función de generador para mantener el estado de su iterador a través de la lista, y el recuento del número de caracteres separadores visto hasta ahora:
l = ['a', 'b', 'X', 'X', 'c', 'd', 'X', 'X', 'f', 'X', 'g']
def splitOn(ll, x, n):
cur = []
splitcount = 0
for c in ll:
if c == x:
splitcount += 1
if splitcount == n:
yield cur
cur = []
splitcount = 0
else:
cur.append(c)
splitcount = 0
yield cur
print list(splitOn(l, 'X', 2))
print list(splitOn(l, 'X', 1))
print list(splitOn(l, 'X', 3))
l += ['X','X']
print list(splitOn(l, 'X', 2))
print list(splitOn(l, 'X', 1))
print list(splitOn(l, 'X', 3))
impresiones:
[['a', 'b'], ['c', 'd'], ['f', 'g']]
[['a', 'b'], [], ['c', 'd'], [], ['f'], ['g']]
[['a', 'b', 'c', 'd', 'f', 'g']]
[['a', 'b'], ['c', 'd'], ['f', 'g'], []]
[['a', 'b'], [], ['c', 'd'], [], ['f'], ['g'], [], []]
[['a', 'b', 'c', 'd', 'f', 'g']]
EDIT: yo soy también un ventilador grande de GroupBy, aquí está mi ir en él:
from itertools import groupby
def splitOn(ll, x, n):
cur = []
for isdelim,grp in groupby(ll, key=lambda c:c==x):
if isdelim:
nn = sum(1 for c in grp)
while nn >= n:
yield cur
cur = []
nn -= n
else:
cur.extend(grp)
yield cur
No muy diferente de mi respuesta anterior, solo permite que groupby se encargue de iterar sobre la lista de entrada, creando grupos de coincidencia de delimitadores y caracteres que no coincidan con delimitadores. Los caracteres que no coinciden solo se agregan al elemento actual, los grupos de caracteres coincidentes hacen el trabajo de dividir elementos nuevos. Para listas largas, esto es probablemente un poco más eficiente, ya que groupby hace todo su trabajo en C, y aún solo itera sobre la lista una vez.
¿Qué debería pasar con menos de N delimitadores? ¿Se eliminan simplemente (sin dividir)? –
@MichaelMior - sí, simplemente se eliminaron (ver el tercer subgrupo). Y "menos" es la palabra que estabas buscando. – PaulMcG
@PaulMcGuire Sí, vi el ejemplo. Pero le pido al OP que me aclare, ya que no quiero generalizar en base a un ejemplo. –