вернуть первый элемент с отличием от двух списков списков и прекратить сравнение
Я работаю над проектом на Python, и мне нужно вернуть первую дельту (разницу) между двумя списками списков. И каждая позиция во внутреннем списке относится к имени.
Мне удалось вернуть первую дельту для каждого параметра, но я хотел бы остановиться на первом подсписке с дельтой.
Мой фактический код:
l_name = ["TIME", "ALPHA", "BETA"] # the list of names
liste1 = [[1, 2, 3.0], [2,5.045,6.003], [3, 8.03, 9], [4, 10.5, 5.5]] # values of all name in one sublist by step time
liste2 = [[1, 2, 3.0], [2,5.045,6.005], [3, 8.0029, 9], [4, 10.5, 5.5555]]
abs_tol = 0.00001 # tolerence to found a delta
def search_var_delta():
for i in range(len(l_name)):
for k in range(len(liste1)):
a = liste1[k][i]
b = liste2[k][i]
diff = abs(a-b)
if diff >= abs_tol :
print("the delta : {}".format(diff),
"the index : {}".format(k+1),
"the parameter : {}".format(l_par[i]))
break
search_var_delta()
Я использую break, чтобы остановить сравнение подсписка, но он продолжал сравнивать следующий подсписок.
Выход :
('the delta : 0.0271', 'the index : 3', 'the parameter : ALPHA')
('the delta : 0.002', 'the index : 2', 'the parameter : BETA')
Но хотелось бы только:
('the delta : 0.002', 'the index : 2', 'the parameter : BETA')
потому что это первый индекс с дельтой
если я добавлю
return l_par[i]
он напечатает АЛЬФА, но, как мы видели, он находится в индексе 3, а не в первом подсписке с дельтой.
3 ответа
Обычно это делается с помощью флага вокруг внутреннего цикла, но в Python вы можете использовать for ... else:
def search_var_delta():
for i in range(len(l_name)):
for k in range(len(liste1)):
# ...
if diff >= abs_tol :
# ...
break
else:
continue
break
Уловка - это код внутри
else
оператор выполняется, когда внутренний
for
цикл завершается, но не тогда, когда он завершается
break
утверждение.
Сделать это можно так:
l_name = ["TIME", "ALPHA", "BETA"]
liste1 = [[1, 2, 3.0], [2,5.045,6.003], [3, 8.03, 9], [4, 10.5, 5.5]]
liste2 = [[1, 2, 3.0], [2,5.045,6.005], [3, 8.0029, 9], [4, 10.5, 5.5555]]
tolerance = 0.00001
def process():
for i, v in enumerate(zip(liste1, liste2), 1):
for j in range(len(v[0])):
if (delta := abs(v[0][j]-v[1][j])) > tolerance:
print(f'Delta = {delta:.3f}, index = {i}, parameter = {l_name[j]}')
return
process()
[Примечание: вам понадобится Python 3.8+]
Примечание: извините за ошибку, l_par - это l_name. Я забыл сменить имя.
Хорошо, ответ был прост, извините,
Нужно только отменить цикл for и использовать return:
def search_var_delta():
for k in range(len(liste1)):
for i in range(len(l_name)):
a = liste1[k][i]
b = liste2[k][i]
diff = abs(a-b)
if diff >= abs_tol :
print("the delta : {}".format(diff),
"the index : {}".format(liste1[k][0]),
"the parameter : {}".format(l_name[i]))
return [diff, liste1[k][0], l_name[i]]
search_var_delta()