Видоизменение выходных данных
Есть некий 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 шт):
Идея в том чтобы все разделители печатать перед очередным элементом. Это позволяет избавиться от висящих | и переводов строк. Перед первым элементом разделителей нет, каждый шестнадцатый элемент ставим пробел, палку и перевод строки, каждый восьмой ставим пробел и палку, иначе только пробел:
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. Собирать или нет всё в одну строку перед печатью - дело вкуса. Кажется, печать по кусочкам делает логику кода проще.
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='')