2012-01-11 2 views
3

У меня есть список строк с различным количеством слов, например.Python: печатать элементы из списка до определенного элемента

abc = ['apple', 'apple ball', 'cat ', 'ball apple', 'dog cat apple', 
     'apple ball cat dog', 'cat', 'ball apple'] 

Что я сделал, так это то, что я подсчитал количество пробелов в каждом элементе. Теперь я хочу напечатать все элементы, в которых есть не более 3 пробелов, до тех пор, пока я не получу элемент с 3 или более пробелами, а не те элементы, которые появляются после него ... например, в приведенном выше списке я должен не получить выход

apple 
apple ball 
cat 
dog cat apple 

ни один из элементов после того, как apple ball cat dog, как это имеет 3 пространства в ней. Я также хотел бы отметить, что у меня есть список таких списков, так что независимо от решения, которое вы, ребята, можете придумать, любезно помните, что он масштабируется до списка списков :) спасибо вам всем ...

ответ

12

Попробуйте itertools.takewhile() :

from itertools import takewhile 
for s in takewhile(lambda x: x.count(" ") < 3, abc): 
    print s 

для списка списков, просто добавьте еще один цикл:

for abc in list_of_lists: 
    for s in takewhile(lambda x: x.count(" ") < 3, abc): 
     print s 
2
>>> sentences = ['apple', 'apple ball', 'cat ', 'ball apple', 'dog cat apple', 'apple ball cat dog', 'cat', 'ball apple'] 

>>> def return_words_until_N_words(sentences, max_words=3): 
...  for sentence in sentences: 
...   words = sentence.split() 
...   for word in words: 
...    yield word 
...   if len(words) >= max_words: 
...    raise StopIteration 
...   

>>> print ' '.join(return_words_until_N_words(sentences)) 
apple apple ball cat ball apple dog cat apple 

Это возвращает слова один на один, и работает, даже если несколько пробелов отдельные слова.

Если вы хотите «предложения» один за другим, ответ Свена очень хорош.

Он может быть приспособлен к производству слова один за другим, вместо:

>>> from itertools import takewhile, chain 
>>> for word in chain(*(sentence.split() for sentence in (
     takewhile(lambda s: len(s.split()) < 3, sentences)))): 
    print word 

apple 
apple 
ball 
cat 
ball 
apple 
Смежные вопросы