Python: печать элементов из списка до определенного элемента - PullRequest
3 голосов
/ 11 января 2012

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

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 пробелов. Я также хотел бы отметить, что у меня есть список таких списков, поэтому, какое бы решение вы, ребята, не могли придумать, имейте в виду, что оно масштабируется до списка списков.

Ответы [ 2 ]

12 голосов
/ 11 января 2012

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

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

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

for abc in list_of_lists:
    for s in takewhile(lambda x: x.count(" ") < 3, abc):
        print s
2 голосов
/ 11 января 2012
>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...