2011-05-28 9 views
8

tengo, por ejemplo, la siguiente lista:Hacer Python Sublistas de una lista utilizando un separador

['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'] 

y quiero que se divide por el carácter "|" por lo que el resultado sería el siguiente:

[[u'MOM', u'DAD'],[ u'GRAND'], [u'MOM', u'MAX', u'JULES']] 

¿Cómo puedo hacer esto? Solo encuentro ejemplos de sublistas en la red que necesitan una longitud de los elementos. por ejemplo

http://blog.samat.org/2005/06/05/splitting_a_sequence_into_subsequences_with_python

Respuesta

15
>>> [list(x[1]) for x in itertools.groupby(['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'], lambda x: x=='|') if not x[0]] 
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']] 
+0

Esta solución para mí está llena de magia pero funciona perfecto! Gracias – W0bble

+2

Lea el [groupby documentation] (http://docs.python.org/library/itertools.html#itertools.groupby) para empezar. :-) –

+1

La línea completa es, para mayor claridad: '[list (x [1]) for x in itertools.groupby (myList, lambda x: x == '|') if not x [0]]' – ninjagecko

4

itertools.groupby() hace esto muy bien ...

>>> import itertools 
>>> l = ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'] 
>>> key = lambda sep: sep == '|' 
>>> [list(group) for is_key, group in itertools.groupby(l, key) if not is_key] 
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']] 
+2

¡Maldición! ¡Demasiado lento! – Johnsyweb

1

solución simple usando el viejo y simple de bucle (fue golpeado hasta que la solución GroupBy, que por cierto es mejor !)

seq = ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'] 

S=[] 
tmp=[] 

for i in seq: 
    if i == '|': 
     S.append(tmp) 
     tmp = [] 
    else: 
     tmp.append(i) 

# Remove empty lists 
while True: 
    try: 
     S.remove([]) 
    except ValueError: 
     break 

print S 

Da

[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']] 
0
>>> reduce(
     lambda acc,x: acc+[[]] if x=='|' else acc[:-1]+[acc[-1]+[x]], 
     myList, 
     [[]] 
    ) 
[[], ['MOM', 'DAD'], ['GRAND'], ['MOM', 'MAX', 'JULES'], []] 

Por supuesto que te gustaría utilizar itertools.groupby, aunque es posible que desee tomar nota de que mi enfoque "correctamente" pone listas vacías en los extremos. =)

+0

Cuando dice "correctamente", ¿cómo coincide eso con el resultado deseado de la pregunta o del artículo vinculado? – Johnsyweb

+1

@Johnsyweb, estoy enterado. Sin embargo, la semántica de la especificación, sin embargo, es poco elegante y debería ser equivalente a '[] .split (token)'; la entrada debería dejar el ''|'' en los extremos. – ninjagecko

Cuestiones relacionadas