Так что бы не пересчитывать массив test_list в начале for x in range(3)
Например, такие 2 варианта
test_id = {k:0 for k in test_list}
test_id = dict.fromkeys(test_list, 0)
По поводу остального: зачем в print использовать min (то, что не выходим за пределы списка), если это условие уже учитывается в цикле приращения (где sum)?
Алгоритм работы программы даже понял (хотя не сразу во всей этой наркомании), но без знания изначальной задумки не совсем понятно, почему делается приращение, но в конце все равно ограничивается максимальным элементом списка, ведь он так выродится. Отсюда сложно сказать, что можно оптимизировать.
Но вместо циклов с sum и изменениями test_id можно задать словарь этих приращений и по нему просто накручивать индекс в каждом цикле
# словарь смещений индекса на каждом цикле
inc = {
'arr_1':1,
'arr_2':2,
'arr_3':2
}
for i in range(5):
print("text-{} border-{} shadow-{} background-{}".format(
test_list['arr_3'][min(i*inc['arr_3'], len(test_list['arr_3'])-1)],
test_list['arr_2'][min(i*inc['arr_2'], len(test_list['arr_2'])-1)],
test_list['arr_2'][min(i*inc['arr_2']+1, len(test_list['arr_2'])-1)],
test_list['arr_1'][min(i*inc['arr_1'], len(test_list['arr_1'])-1)]
))
выдаст
text-red border-green shadow-brown background-red
text-black border-black shadow-black background-blue
text-green border-black shadow-black background-yellow
text-green border-black shadow-black background-yellow
text-green border-black shadow-black background-yellow