2010-06-06 52 views
5

Python'da bir çözümleyici yazıyorum. Ben gibi jeton, bir liste halinde bir giriş dizesi dönüştürdüğünüz:Python'da bir listeyi bölme

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

Ben str.split('+') fonksiyonu gibi, birden fazla liste halinde liste bölmek mümkün istiyorum. Ancak my_list.split('+') yapmanın bir yolu yok gibi görünüyor. Herhangi bir fikir?

Teşekkürler!

cevap

8

Sen oranlarını kullanarak oldukça kolay listeleri için kendi bölünmüş fonksiyonu yazabiliriz:

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

alternatif bir yolu list.index kullanmak ve durum yakalamak için geçerli:

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

Her iki şekilde çağırabilir bunun gibi:

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

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

Sonuç:

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

Python'da ayrıştırma yapmak için pyparsing gibi bir şeye bakmak da isteyebilirsiniz.

+3

[piton Lex-Yacc (PLY)] (http://www.dabeaz.com/ply/) ve [PyPEG] (http://fdik.org/pyPEG/) de iyi. – exupero

1

hızlı kesmek, önce listeden bir dize oluşturmak, '+' adlı bölme, yeniden bölme (bu bir matris oluşturur) katılmak için .join() yöntemini kullanabilirsiniz, sonra listeyi kullanın() yöntem ayrıca, tek tek jeton

matriste her öğe bölmek
a = ['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')', '/', '3', '.', 'x', '^', '2'] 

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

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

print(c) 

sonucu:

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

Bu muhtemelen a = ['12', '+', '34'] 'için istediğini yapmaz. –

+0

haklısın, bunun hakkında düşünmedin – momo