2010-06-06 79 views
5

Sto scrivendo un parser in Python. Ho convertito una stringa di input in un elenco di token, come ad esempio:Dividere una lista in python

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

Voglio essere in grado di dividere l'elenco in più elenchi, come la funzione str.split('+'). Ma non sembra essere un modo per fare my_list.split('+'). Qualche idea?

Grazie!

risposta

8

È possibile scrivere la propria funzione di divisione per gli elenchi abbastanza facilmente usando resa:

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

Un modo alternativo è quello di utilizzare list.index e intercettare l'eccezione:

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:] 

In entrambi i casi è possibile chiamare così:

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

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

Risultato:

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

Per l'analisi in Python si potrebbe anche voler guardare qualcosa come pyparsing.

+3

[Python Lex-Yacc (PLY)] (http://www.dabeaz.com/ply/) e [PyPEG] (http://fdik.org/pyPEG/) sono buoni anche. – exupero

1

attacco rapido, puoi prima usare il metodo .join() per unirti a creare una stringa fuori dall'elenco, dividerlo a '+', ridistribuirlo (questo crea una matrice), quindi usare l'elenco() metodo per dividere ulteriormente ogni elemento della matrice per singoli token

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

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

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

print(c) 

risultato:

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

Questo probabilmente non fa quello che vuole per 'a = ['12', '+', '34']'. –

+0

hai ragione, non ci hai pensato – momo

Problemi correlati