@fantom_ask

Как автоматически сделать все неизвестные значения index в массиве равными 0?

Я хочу сократить свой код

test_list = {
'arr_1':['red','blue','yellow'],
'arr_2':['green','brown','black'],
'arr_3':['red','white','black','green']
}
test_id = {}

for x in range(3):
	for key in test_list:
		try:
			test_id[key]
		except KeyError:
			test_id[key] = 0
	
	print("text-{}  border-{} shadow-{} background-{}".format(
	test_list['arr_3'][min(test_id['arr_3'],len(test_list['arr_3'])-1)],
	test_list['arr_2'][min(test_id['arr_2'],len(test_list['arr_2'])-1)],
	test_list['arr_2'][min(test_id['arr_2']+1,len(test_list['arr_2'])-1)],
	test_list['arr_1'][min(test_id['arr_1'],len(test_list['arr_1'])-1)]
	))
	
	for key in test_list:
		if key == 'arr_2' or  key == 'arr_3':
			sum = 2
		else :
			sum = 1
		test_id[key] = min(test_id[key]+sum,len(test_list[key])-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

Так что бы не пересчитывать массив test_list в начале for x in range(3)
Можно ли это как нибудь сделать?

Зарание говорю что число sum может быть произвольным так как неизвестно через сколько нужно будет перепрыгнуть цветов в каждом массиве
и сколько вообще цветов будет.
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ответы на вопрос 1
@o5a
Так что бы не пересчитывать массив 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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы