2010-07-12 21 views
6

En python, ¿cómo puedo dividir una lista larga en una lista de listas donde sea que me encuentre '-'? Por ejemplo, ¿cómo puedo convertir:una lista> una lista de listas

['1', 'a', 'b','---', '2','c','d','---','3','123','e','---','4'] 

a

[['1', 'a', 'b'],['2','c','d'],['3','123','e'],['4']] 

Muchas gracias por adelantado.

Respuesta

17
In [17]: import itertools 
# putter around 22 times 
In [39]: l=['1', 'a', 'b','---', '2','c','d','---','3','123','e','---','4'] 

In [40]: [list(g) for k,g in itertools.groupby(l,'---'.__ne__) if k] 
Out[40]: [['1', 'a', 'b'], ['2', 'c', 'd'], ['3', '123', 'e'], ['4']] 
+0

+1 Agradable (no pensé inmediatamente en 'itertools.groupby' aquí, pero realmente encaja en la factura) – ChristopheD

+0

Gracias por su respuesta. ¿Hay alguna forma de comprobar x == '---' en la línea anterior con una expresión regular (algo así como x == re.match ('-'))? Muchas gracias – DGT

+0

Sí, podría usar algo como '[list (g) for k, g en itertools.groupby (l, lambda x: re.match ('---', x)) si no k]'. La expresión 're.match (...)' devuelve None cuando 'x' no coincide con el patrón. Por lo tanto, 'k' es' Ninguno' para los elementos que desea conservar. Así que cambié la condición a 'if not k'. – unutbu

4
import itertools 

l = ['1', 'a', 'b','---', '2','c','d','---','3','123','e','---','4'] 
r = [] 

i = iter(l) 
while True: 
    a = [x for x in itertools.takewhile(lambda x: x != '---', i)] 
    if not a: 
    break 
    r.append(a) 
print r 

# [['1', 'a', 'b'], ['2', 'c', 'd'], ['3', '123', 'e'], ['4']] 
+0

+1 Me gusta mejor que mi solución similar (la eliminaré en breve) debido al enfoque eficiente 'iter' (solo cómprela una vez). Pero probablemente quieras reemplazar 'for j in range (7)' con 'while True' para manejar longitudes arbitrarias. – ChristopheD

+0

@ChristopheD: Sí, corregido. –

-1

Ha sido un tiempo desde que he hecho ningún pitón por lo que mi sintaxis va a ser muy lejos, pero un simple bucle debería ser suficiente.

Realizar un seguimiento de los índices de dos números

firstList = ['1', 'a', 'b','---', '2','c','d','---','3','123','e','---','4'] 
listIndex = 0 
itemIndex = 0 
ii = 0 
foreach item in firstList 
    if(firstList[ii] == '---') 
    listIndex = listIndex + 1 
    itemIndex = 0 
    ii = ii + 1 
    else secondList[listIndex][itemIndex] = firstList[ii] 
1
import itertools 

a = ['1', 'a', 'b','---', '2','c','d','---','3','123','e','---','4'] 
b = [list(x[1]) for x in itertools.groupby(a, '---'.__eq__) if not x[0]] 

print b  # or print(b) in Python 3 

El resultado es

[['1', 'a', 'b'], ['2', 'c', 'd'], ['3', '123', 'e'], ['4']] 
0

Aquí es una solución sin itertools:

def foo(input): 
    output = [] 
    currentGroup = [] 
    for value in input: 
     if '-' in value: #if we should break on this element 
      currentGroup.append(value) 
     elif currentGroup: 
      output.append(currentGroup) 
      currentGroup = [] 
    if currentGroup: 
     output.append(currentGroup) #appends the rest if not followed by separator  
    return output 

print (foo (['1', 'a', 'b','---', '2','c','d','---','3','123','e','---','4'])) 
+1

Más allá de cierto umbral, la legibilidad es relativa. Eso solo parece una gran cantidad de código para mí. –

+1

Usando (1) 'value.find ('-') == -1' en lugar de' '-' in value' (2) camelCase (2) paréntesis redundantes en '(el) if' a veces (3) espacios extraños entre paréntesis a veces (4) declaración lo suficientemente larga como para hacer que SO inserte la barra de desplazamiento horizontal ferschlugginer (5) sin espacio después de la coma a veces hace que parezca un gran lío de código fugly para mí. –

+0

Ambos tienen razón. Código editado y descripción. :) –

1

Ésta es una forma de hacerlo :

lst=['1', 'a', 'b','---', '2','c','d','---','3','123','e','---','4'] 
indices=[-1]+[i for i,x in enumerate(lst) if x=='---']+[len(lst)] 
answer=[lst[indices[i-1]+1:indices[i]] for i in xrange(1,len(indices))] 
print answer 

Básicamente, esto encuentra las ubicaciones de la cadena '---' en la lista y luego divide la lista en consecuencia.

Cuestiones relacionadas