Упаковка повторяющихся подряд символов во вложенные списки (python3)
Нужно что бы программа принимающая символы на ввод, например:
w w w o r l d g g g g r e a t t e c c h e m g g p w w w z a z
выводила список следующего вида:
[['w', 'w', 'w'], ['o'], ['r'], ['l'], ['d'], ['g', 'g', 'g', 'g'], ['r'], ['e'], ['a'], ['t', 't'], ['e'], ['c', 'c'], ['h'], ['e'], ['m'], ['g', 'g'], ['p'], ['w', 'w', 'w'], ['z'], ['a'], ['z']]
Что нужно исправить в коде ниже что бы он работал так, как описано выше?
def list_for_copied_letters(text):
list_for_print = []
list_letters = []
for letters in range(1, len(text)):
if text[letters] == text[letters - 1]:
list_letters.extend(text[letters - 1])
else:
list_for_print.append(list_letters)
list_letters = []
print(list_for_print)
list_for_copied_letters((input() + " *").split(" "))
Спасибо!
Ответы (4 шт):
Автор решения: pankazimierz
→ Ссылка
def list_for_copied_letters(text):
list_for_print = []
list_letters = []
for letters in range(len(text) - 1):
if text[letters] != text[letters + 1]:
list_letters.append(text[letters])
list_for_print.append(list_letters)
list_letters = []
else:
list_letters.append(text[letters])
print(list_for_print)
list_for_copied_letters((input() + " *").split(" "))
Автор решения: TigerTV.ru
→ Ссылка
Можно так:
from itertools import groupby
text = "wwworldggggreattecchemggpwwwzaz"
res = [list(g) for k, g in groupby(text)]
print(res)
Вывод:
[['w', 'w', 'w'], ['o'], ['r'], ['l'], ['d'], ['g', 'g', 'g', 'g'], ['r'], ['e'], ['a'], ['t', 't'], ['e'], ['c', 'c'], ['h'], ['e'], ['m'], ['g', 'g'], ['p'], ['w', 'w', 'w'], ['z'], ['a'], ['z']]
Автор решения: Andy Pavlov
→ Ссылка
Можно сделать и через регулярные выражения
import re
text = 'wwworldggggreattecchemggpwwwzaz'
pattern = re.compile(r'(.)\1*')
print([list(p.group()) for p in pattern.finditer(text)])
Вывод
[['w', 'w', 'w'], ['o'], ['r'], ['l'], ['d'], ['g', 'g', 'g', 'g'], ['r'], ['e'], ['a'], ['t', 't'], ['e'], ['c', 'c'], ['h'], ['e'], ['m'], ['g', 'g'], ['p'], ['w', 'w', 'w'], ['z'], ['a'], ['z']]
Автор решения: flurry_pa
→ Ссылка
Решение в духе основной логики автора. Реализация проще без использования range:
def list_for_copied_letters(text):
list_for_print = []
list_letters = []
for i, character in enumerate(text):
if character in list_letters or len(list_letters) == 0:
list_letters.append(character)
else:
list_for_print.append(list_letters)
list_letters = [character]
if i == len(text) - 1:
list_for_print.append(list_letters)
return list_for_print
string = 'wwworldggggreattecchemggpwwwzaz'
print(list_for_copied_letters(text=string))