2016-02-28 15 views
6

ben şöyle s dizeleri bir listesi var. Bir ?!.\n orada zaman aşağıdaki gibi yeni bir alt liste oluşturulur: Python:</p> <pre><code>s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.'] </code></pre> <p>Bu liste sublists bölünebilir istiyorum: dizeleri alt listesini içeren Liste

final = [['Hello', 'world', '!'], 
     ['How', 'are', 'you', '?'], 
     ['Have', 'a', 'good', 'day', '.']] 

bu çalıştı:

x = 0 
for i in range(len(s)): 
    if s[i] in ('!','?','.','\n'): 
     final = s[x: x+i] 
    x = i+1 

nihai saklar benim çıkışını. Olması gereken şekilde değil. Baska öneri? Aşağıdaki kullanabilirsiniz

cevap

1

:

s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.'] 
letters = ['!', '?', '.'] 

idxes = [idx for idx, val in enumerate(s) if val in letters] 
idxes = [-1] + idxes 
answer = [s[idxes[i]+1:idxes[i+1]+1] for i in range(len(idxes[:-1]))] 
print(answer) 

Çıktı

[['Hello', 'world', '!'], ['How', 'are', 'you', '?'], ['Have', 'a', 'good', 'day', '.']] 

Bu bir noktalama işareti oluştuğu idxess ait ayıklamak için enumerate işlevi inşa içeren bir liste anlama kullanır. Daha sonra s'u idxes değerlerini kullanarak dilimleyerek bir alt liste listesi oluşturmak için başka bir liste anlama kullanır.

1
s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.'] 
final = [] 
b = [] 
for x in s: 
    b.append(x) 
    if x in ('.', '?', '!', '\n'): 
     final.append(b) 
     b = [] 
2

Sen o kadar uzakta değildi:

x=0 
final=[] 
for i in range(len(s)): 
    if s[i] in ('!','?','.','\n'): 
     final.append(s[x:i+1]) 
     x=i+1 

Sadece bir indeksleme sorunu bit ve tüm kısmi listeleri toplamak için nihai bir liste yapmaya.

+0

yerine endeksini hesaplamak için 'enumerate' kullanımını tavsiye ve genel olarak çünkü doğrusal arama vs onun sürekli zamanın üyelik testleri için bir' set' kullanmak daha iyidir tuples veya liste – Copperfield

+0

@ Copperfield: Gerçekten de 'sayım' indeksleme için daha iyidir, ancak kodun görüntüsü. Orijinal yapıya olabildiğince yakın kalmak istedim. – mkiever

0

1 Son olarak boş bir dizi olsun.

2 Boş değilken ve dizin < len (ler) olduğunda döngü doğrudur. 0

4 küçültmek

+ 1 kelime konumuna getirin ana dize s ile nihai diziye

3 ekleme. Eğer yoksa bu yüzden gerçekten çoğu zaman, ben de, ilk listeden bir jeneratör oluşturmak için deneyebilirsiniz düşünüyorum ama senin durumunda, python kullanmak değilim

final = [] 
i =0 
while len(s) and i<len(s): 
    if s[i] in ('!','?','.','\n'): 
     final.append(s[:i+1]) 
     s = s[i+1:] 
    i +=1 
print(final) 
0

endeks değeri incr

5 listelerin mağaza listesine:

>>> from itertools import chain 
>>> def func(s): 
...  g = iter(s) 
...  def inner_func(g): 
...   for x in g: 
...    yield x 
...    if x in ('.', '?', '!', '\n'): 
...     break 
...  while True: 
...   try: 
...    f = g.next() 
...   except StopIteration: 
...    break 
...   else: 
...    yield inner_func(chain([f], g)) 
>>> [[y for y in x] for x in func(s)] 
[['Hello', 'world', '!'], ['How', 'are', 'you', '?'], ['Have', 'a', 'good', 'day', '.']]