Как список строк преобразовать по определенному признаку?
Дан список строк, в котором некоторые значения заканчиваются на '/'. Нужно такие значения и следующее за ними объединить в общую строку. Пример:
['0.3/', '1.2/', '1.2/', '1.2', '11']
Результат:
['0.3/1.2/1.2/1.2', '11]
Строки с слешем могут быть как в начале, так в середине, так и в конце строки. Последний символ строки не заканчивается слешем
Ответы (3 шт):
Делаете переменную, в которую доклеиваете строки, если предыдущая строка заканчивалась на слэш. Если предыдущая строка не заканчивалась на слэш, добавляете все склеенные значения в выходной список, или выводите через yield в генераторе:
def join_slashes(s: list):
accumulator = ''
for item in s:
if accumulator and not accumulator.endswith('/'):
yield accumulator
accumulator = ''
accumulator += item
yield accumulator
print(list(join_slashes(['0.3/', '1.2/', '1.2', '1.2/', '1.3', '11'])))
Через накопление в списке вместо генератора:
def join_slashes(s: list):
result = []
accumulator = ''
for item in s:
if accumulator and not accumulator.endswith('/'):
result.append(accumulator)
accumulator = ''
accumulator += item
result.append(accumulator)
return result
print(join_slashes(['0.3/', '1.2/', '1.2', '1.2/', '1.3', '11']))
Вывод в обоих вариантах:
['0.3/1.2/1.2', '1.2/1.3', '11']
lst = ['0.3/', '1.2/', '1.2', '1.2/', '1.3', '11']
res = [x.lstrip(",") for x in "/,".join(lst).replace("//,",",").split("/")]
res:
['0.3,1.2,1.2', '1.2,1.3', '11']
Ну раз выкладывают уже код и я выложу. Без отдельного аккумулятора, достаточно текущего списка.
lst_in = ['0.3/', '1.2/', '1.2/', '1.2', '11']
lst_out = []
for x in lst_in:
if lst_out and lst_out[-1].endswith('/'):
lst_out[-1] += x
else:
lst_out.append(x)
print(lst_out)
Или вариант через zip:
lst_in = ['0.3/', '1.2/', '1.2/', '1.2', '11']
lst_out = []
for curr,prev in zip(lst_in, ['']+lst_in):
if prev.endswith('/'):
lst_out[-1] += curr
else:
lst_out.append(curr)
print(lst_out)