Разделить предложение на слова не используя метод split

я не понимаю почему мой код выводит только первые два слова

a = "Разделиsdf меняdfss болгаркой "
b=0
c=0
a1 = 0
for j in a:
    b+=1
    if j ==' ':
        a1+=1
        print(a1)
        print(a[c:b])
        c+=b

Ответы (5 шт):

Автор решения: Виктор

Для изучения:

a = "Разделиsdf  меняdfss болгаркой test"
s = ''
out =[]
for j in a: // Перебор по символам
    if j ==' ': // Нашли пробел
        if len(s) > 0 : // В строке накопления символов что-то есть?
            out.append(s) // Да - заносим слово в массив
            s='' // Очищаем строку
    else:
        s = s + j //Дополняем строку не пробелом

if len(s) > 0: // Если в строке ещё что-то есть, то её в массив
    out.append(s)

print(out) 

Вывод: ['Разделиsdf', 'меняdfss', 'болгаркой', 'test']

→ Ссылка
Автор решения: Алексей Р

Вариант со срезами и find:

a, out = "Разделиsdf меняdfss болгаркой ", []
while a:
    pos = a.find(' ')
    if pos >= 0:
        out.append(a[:pos])
        a = a[pos + 1:]
    else:
        out.append(a)
        break
print(out)
['Разделиsdf', 'меняdfss', 'болгаркой']
→ Ссылка
Автор решения: Zhihar

вариант 1 (через регулярки):

text = "Разделиsdf меняdfss болгаркой "

import re
res = re.findall(r"\w+", text)

вариант 2 (в лоб):

res, tmp = [], ""
for l in text:
    if l in " \t":
        if tmp:
            res.append(tmp)
            tmp = ""
    else:
        tmp += l
if tmp:
    res.append(tmp)

вариант 2.1 (без временной переменной):

res = [""]
for l in text:
    if l in " \t":
        if res[-1]: res.append("")
    else:
        res[-1] += l
if not res[-1]: res.pop()
→ Ссылка
Автор решения: HardTaker

Вместо (c += b) могу предложить без сильного изменения (c = b), т.е.

a = "Разделиsdf меняdfss болгаркой "
b=0
c=0
a1 = 0
for j in a:
    b+=1
    if j ==' ':
        a1+=1
        print(a1)
        print(a[c:b])
        c=b

Если включить режим отладки то видно что при выводе третьего слова, b = 30, a c = 31, из-за чего он выводит пробел (буквально)

→ Ссылка
Автор решения: TigerTV.ru

Используя groupby:

from itertools import groupby

a = "Разделиsdf меняdfss болгаркой "
res = [''.join(g) for k, g in groupby(a, ' '.__ne__) if k]
print(res)

Можно задействовать автоматное программирование:

class BeforeState:
    @staticmethod
    def action(ch, machine):
        if ch not in machine.seps:
            machine.word.append(ch)
            machine.state = InsideState

class InsideState:
    @staticmethod
    def action(ch, machine):
        if ch in machine.seps:
            machine.result.append(''.join(machine.word))
            machine.word = []
            machine.state = BeforeState
        else:
            machine.word.append(ch)

                
class FiniteStateMachine:
    def __init__(self):
        self.state = BeforeState
        self.word = []
        self.result = []
        self.seps = ' \n'

    def step(self, ch):
        self.state.action(ch, self)

    def divide(self, s):
        any(map(self.step, s))
        self.step(self.seps[0])
        result = self.result
        self.result = []
        return result


me = "Разделиsdf меняdfss    болгаркой\n\n\nНовая строка"
bolgarka = FiniteStateMachine()
print(bolgarka.divide(me))

# ['Разделиsdf', 'меняdfss', 'болгаркой', 'Новая', 'строка']
→ Ссылка