Видоизменение выходных данных

Есть некий json.

s = {
    'value': '0,fc,0,5,23,9,1,fg,ab,1,ab,2,05,ln,dd,45,6,sc,34,4,5,1,vb,fg,65,34,98,0,fc,0,5,7,ab'
}

Необходимо после каждого 8 элемента ставить знак '|', а после каждого 16 элемента переходить на следующую строку. То есть на выходе должно получится так:

00 fc 00 05 23 09 01 fg | ab 01 ab 02 05 ln dd 45 | 
06 sc 34 04 05 01 vb fg | 65 34 98 00 fc 00 05 07 |
ab

Вот пример моего кода

s = {
    'value': '0,fc,0,5,23,9,1,fg,ab,1,ab,2,05,ln,dd,45,6,sc,34,4,5,1,vb,fg,65,34,98,0,fc,0,5,7'
}

a = list(s.get('value').split(','))
z = 0

for i in range(16, len(a), 19):
    a.insert(i, '\n')
    for j in range(8, len(a), 9):
        a.insert(j, '|')
        z = ' '.join(map(lambda x: x.zfill(2), a)).replace(',', ' ').replace('0|', '|').replace('0\n', '\n')
        # print(z)

print(z)

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

Автор решения: Эникейщик

Сначала вставить |, а потом уже перевод строки.

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

Идея в том чтобы все разделители печатать перед очередным элементом. Это позволяет избавиться от висящих | и переводов строк. Перед первым элементом разделителей нет, каждый шестнадцатый элемент ставим пробел, палку и перевод строки, каждый восьмой ставим пробел и палку, иначе только пробел:

def tprint(a):
    for i, v in enumerate(a):
        if i == 0:
            pass
        elif i % 16 == 0:
            print(' |')
        elif i % 8 == 0:
            print(' | ', end='')
        else:
            print(' ', end='')
        print(f'{v:>02}', end='')
    print()


s = {
    'value': '0,fc,0,5,23,9,1,fg,ab,1,ab,2,05,ln,dd,45,6,sc,34,4,5,1,vb,fg,65,34,98,0,fc,0,5,7,ab'
}
tprint(s.get('value').split(','))
$ python tprint.py 
00 fc 00 50 23 90 10 fg | ab 10 ab 20 05 ln dd 45 |
60 sc 34 40 50 10 vb fg | 65 34 98 00 fc 00 50 70 |
ab

P.S. Ради печати менять исходный список не надо. Это будет тормозить на больших списках и требует сложной математики.

P.P.S. Собирать или нет всё в одну строку перед печатью - дело вкуса. Кажется, печать по кусочкам делает логику кода проще.

→ Ссылка
Автор решения: eri
s = {
    'value': '0,fc,0,5,23,9,1,fg,ab,1,ab,2,05,ln,dd,45,6,sc,34,4,5,1,vb,fg,65,34,98,0,fc,0,5,7'
}

def regen(sv):
    i = 0
    for v in sv.split(','):
        yield v.zfill(2)
        yield ' '
        i += 1
        if i % 16 == 0 : yield '|\n'
        elif i % 8 == 0 : yield '| '
        


print(''.join(regen(s['value'])))

Запустить строку в генератор и собрать её заново с вставками в нужных местах. Для буферизированного вывода можно и не собирать.

for c in regen(s['value']): print(c,end='')
→ Ссылка