Ваш исходный код был близок, и его было легче прочитать, чем какое-то сжатое выражение. Проблема с вашим кодом - пара незначительных ошибок: инициализация new_value
каждый раз при первоначальном сканировании, а не только один раз; и заменив max_list
вычисленным скаляром, зацикливая его как список.
В последней строке вы должны указать:
max_list[i] = float(max_list[i]) / new_value
но вы удалили индекс массива, который заменил бы список одним значением. На второй итерации цикла ваш Python выдаст исключение из-за недопустимого индекса в не список.
Поскольку ваш код развивает все новые и новые значения new_value по мере его продвижения, я рекомендую вам не заменять элементы списка во время первого сканирования. Сделайте второе сканирование, как только вы вычислите окончательное значение для new_value:
max_list = [83, 1350, 1, 100]
# Calculate the required "normalizing" power-of-ten
new_value = 1.0
for i in range(len(max_list)):
while new_value < max_list[i]:
new_value *= 10.0
# Convert the values to fractions in [0.0, 1.0]
for i in range(len(max_list)):
max_list[i] = max_list[i] / new_value
print max_list
# "[0.0083000000000000001, 0.13500000000000001, 0.0001, 0.01]"
Обратите внимание, что я должен был инициализировать new_value, как если бы это было значение с плавающей запятой, чтобы оно приводило к частным числам с плавающей запятой. Существуют альтернативные способы сделать это, например, использовать float(max_list[i])
для получения значения для нормализации. Исходное вычисление new_value
начиналось с каждого элемента, поэтому ваш пример вернул бы new_value == 100
, потому что это основывалось на последнем элементе в списке ввода, который равен 100.