Разделить предложение на слова не используя метод 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', 'болгаркой', 'Новая', 'строка']