Разделить строку на списки с одинаковыми символами
Есть строка, которая состоит из несколько разных и в разный момент повторяющихся символов
Пример: '<<<VVV>>>VVV'
Надо получить: ['<<<', 'VVV', '>>>', 'VVV'] или [['<', '<', '<'], ['V', 'V', 'V'], ['>', '>', '>'], ['V', 'V', 'V']]
То есть надо разделять строку как только следующий символ становиться другим.
Подряд может идти также только один символ, в этом случае его надо отделять так же, как все остальные.
Можно использовать любые библиотеки
Как это сделать в одну строку кода? Если никак, то прошу показать самый короткий по коду вариант.
Вот как сделал я:
result = []
last_elem = string[0]
temp = []
for elem in string:
if elem == last_elem:
temp.append(elem)
else:
result.append(temp)
temp = [elem]
last_elem = elem
result.append(temp)
Ответы (3 шт):
это конечно не в одну строку, но пусть будет
def f(s):
l=[0] + [i+1 for i, el in enumerate(zip(s[:-1], s[1:])) if el[0]!=el[1]] + [None]
return [s[i:j] for i, j in zip(l[:-1], l[1:])]
zip(s[:-1], s[1:]) создаём список, где каждый элемент это s[0] и s[1], s[1] и s[2], s[2] и s[3], и т.д.
if el[0]!=el[1] оставляем элементы где первый значение не равно второму т.е. моменты перехода с одного символа на другой
попробуйте так:
import re
a = "<<<VVV>>>VVV"
res = [x[0] for x in re.findall(r"((.)\2*)", a)]
res:
['<<<', 'VVV', '>>>', 'VVV']
Если вы желаете в одну строку бессмысленно и беспощадно, то можно еще так извратиться:
s = '<<<VVV>>>VVV'
f = lambda s, ans = []: ans if len(s) == 0 else f(s[1:], [s[0]]) if len(ans) == 0 else f(s[1:], ans[:-1] + [ans[-1] + s[0]]) if s[0] == ans[-1][0] else f(s[1:], ans + [s[0]])
print(f(s))
Разбираю лямбду по кусочкам:
f = ans, если s - пустая;
= f(s[1:], [s[0]]), если ans - пустой;
= f(s[1:], ans[:-1] + [ans[-1] + s[0]]), если последний блок символов в ans совпадает с первым символом s
= f(s[1:], ans + [s[0]]), если последний блок символов в ans не совпадает с первым символом s
В нормальном рекурсивном виде она же:
def f(s, ans = []):
if len(s) == 0:
return ans
if len(ans) == 0 or s[0] != ans[-1][0]:
return f(s[1:], ans + [s[0]])
return f(s[1:], ans[:-1] + [ans[-1] + s[0]])