2010-06-06 20 views
5

Escribo un analizador en Python. Me he convertido en una cadena de entrada en una lista de tokens, tales como:División de una lista en python

['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')', '/', '3', '.', 'x', '^', '2']

Quiero ser capaz de dividir la lista en varias listas, al igual que la función str.split('+'). Pero no parece haber una manera de hacerlo my_list.split('+'). ¿Algunas ideas?

Gracias!

Respuesta

8

Usted puede escribir su propia función de división para las listas con bastante facilidad mediante el uso de rendimiento:

def split_list(l, sep): 
    current = [] 
    for x in l: 
     if x == sep: 
      yield current 
      current = [] 
     else: 
      current.append(x) 
    yield current 

Una forma alternativa es utilizar list.index y detectar la excepción:

def split_list(l, sep): 
    i = 0 
    try: 
     while True: 
      j = l.index(sep, i) 
      yield l[i:j] 
      i = j + 1 
    except ValueError: 
     yield l[i:] 

De cualquier manera se puede llamar es como esto:

l = ['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')', 
    '/', '3', '.', 'x', '^', '2'] 

for r in split_list(l, '+'): 
    print r 

Resultado:

['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')'] 
['4', ')', '/', '3', '.', 'x', '^', '2'] 

Para el análisis en Python es posible que también desee ver algo como pyparsing.

+3

[Python Lex-Yacc (PLY)] (http://www.dabeaz.com/ply/) y [PyPEG] (http://fdik.org/pyPEG/) también son buenos. – exupero

1

truco rápido, puede utilizar primero el método .join() para unirse a crear una cadena de su lista, dividirla en '+', volver a dividir (esto crea una matriz), luego usar la lista() método para dividir adicionalmente cada elemento en la matriz para tokens individuales

a = ['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')', '/', '3', '.', 'x', '^', '2'] 

b = ''.join(a).split('+') 
c = [] 

for el in b: 
    c.append(list(el)) 

print(c) 

resultado:

[['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')'], ['4', ')', '/', '3', '.', 'x', '^', '2']] 
+0

Esto probablemente no hace lo que quiere para 'a = ['12', '+', '34']'. –

+0

tienes razón, no pensaste en eso – momo

Cuestiones relacionadas