Если вы пытаетесь сгруппировать слова по верхнему или (частично) нижнему регистру, itertools.groupby
может быть более простым способом:
>>> print('\n'.join(
... ' '.join(w) for _, w in itertools.groupby(
... s.split(' '),
... lambda w: any(c.islower() for c in w)
... )
... ))
WE, THE PEOPLE OF INDIA,
having solemnly resolved, to constitute India into a
SOVEREIGN, SOCIALIST, SECULAR, DEMOCRATIC REPUBLIC
and to secure to all its citizens
Ваш код останавливается на "g "
потому что "g".isupper()
и " ".islower()
оба являются False
, что удовлетворяет проверке равенства, которая нарушает ваш l oop. Это не заканчивается на " h"
, потому что " ".isupper()
- это False
, а "h".islower()
- True
.
Чтобы ваш код работал так, как вы хотите, пропуска неалфавитных c символов в l oop недостаточно, потому что они все еще существуют в s
. Разделение строки и работа с результирующим списком (как я сделал в моем коде выше) значительно упрощает задачу, равно как и категоризация слов как полных единиц (что делает groupby
с функцией any
), а не пытаясь обнаружить границы между ними.