Помогите правильно написать цикл в python с учетом значений из 3 столбцов

Есть 3 столбца range_1, range_2, range_3:

range_1
26365
3757
3723
range_2
-275,08
757,74
668,44
range_3
-1
1
-1

Также есть 2 значения sum_1 = 75644.

Нужно написать цикл который будет проверять значение столбца range_2 равняется ли оно максимальному значению данного столбца, если равняется, то необходимо прибавить значение range_3 к значению range_1 по строке, по которой было найдено максимальное значение. Цикл должен повторяться пока сумма значений по столбцу range_3 не достигнет sum_1.

def rounding(range_1, range_2, range_3, summ):
   if sum(range_1) != summ:
       for i in range_1:
            for j in range_2:
                for z in range_3:
                    if range_2[j] == max(range_2):
                        range_1[i] += range_3[z]

Выдает ошибку KeyError: -1.837480750236864

Подскажите как правильно написать цикл? Так как я не совсем понимаю как использовать в цикле значения двух столбцов. Пишу код на python. Заранее спасибо.


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

Автор решения: CrazyElf

Если вам нужно проверять значения по всем трём столбцам в одной и той же строке и все столбцы имеют одно и то же число строк, то делается это по-другому - просто итерируетесь по строке и всё, индекс строки один, не нужно никаких вложенных циклов. Ну и не if, конечно, а цикл while должен быть:

while sum(range_1) != summ:
    for i in range(len(range_1)):
        if range_2[i] == max(range_2):
            range_1[i] += range_3[i]

А вообще числа с плавающей точкой - штука коварная, я не уверен, что точное совпадение будет достигнуто и цикл закончится. Возможно, нужно проверять совпадение с какой-то точностью, а не абсолютно.

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

Я вообще не понял зачем здесь циклы. Если разбить задачу на этапы, то

  1. Найти индекс максимального элемента в столбце roundin_1.
  2. Проверить, что значением home_label по найденному индексу можно увеличить значение value_1 по найденному индексу до значения sum_1.
  3. Просто добавить к этому значению необходимую разницу.
sign = lambda x: -1 if x < 0 else 1
def rounding(_label, _roundin, _value, _summ):
    max_roundin = max(_roundin)
    max_index = _roundin.index(max_roundin)
    summ_value = sum(_value)
    increment = _label[max_index]
    delta = _summ - summ_value
    if sign(delta) != increment:
        print("It's impossible to reach the result.")
    else:
        _value[max_index] += delta


label = [-1, 1, -1]
roundin = [-275.08, 757.74, 668.44]
value = [26365, 3757, 3723]
summ = 75644
        
rounding(label, roundin, value, summ)
print(value)
[26365, 45556, 3723]
→ Ссылка