我该如何改进这段代码?

时间:2010-07-05 01:10:54

标签: python rounding

# max_list = [83, 1350, 1, 100]
for i in range(len(max_list)):
     new_value = 1
     while new_value < max_list[i]:
          new_value *= 10
     max_list = new_value

我正在做的是将数字四舍五入到最接近的,嗯,零填充值?我不确定它会被称为什么。但基本上,我想要83 - &gt; 100,1 - &gt; 1,1350 - &gt; 10000,100 - &gt; 100.我尝试使用round()函数,但无法按照我想要的那样去做。

这样做但是我认为它可以写成更少的行。

7 个答案:

答案 0 :(得分:11)

我是用数学方法做的:

from math import ceil, log10
int(pow(10, ceil(log10(abs(x or 0.1)))))

答案 1 :(得分:3)

def nextPowerOfTen(x):
  if x in [0, 1]:
     return x
  elif x < 1:
    return -nextPowerOfTen(abs(x))
  else:
    return 10**len(str(int(x) - 1))

>>> nextPowerOfTen(83)
100
>>> nextPowerOfTen(1350)
10000
>>> nextPowerOfTen(1)
1
>>> nextPowerOfTen(100)
100
>>> nextPowerOfTen(0)
0
>>> nextPowerOfTen(-1)
-1
>>> nextPowerOfTen(-2)
-10

它做了一些消极的事情,不确定这是否是你想要的行为。

答案 2 :(得分:1)

  

我需要它是1350/10000 = 0.135所以它在[0,1]范围内。

为什么你最初没有这么说?

new_val = float("0." + str(old_val))

除非你还需要其他数字吗?

答案 3 :(得分:1)

>>> x = 12345.678
>>> y = round(x)
>>> round(10 * y, -len(str(y)))
100000

答案 4 :(得分:0)

伪代码:

div = input != 1 ? power(10,truncate(log10(abs(input))) + 1) : 1;
percent = input/div;

答案 5 :(得分:0)

你的原始代码很接近,比一些简洁的表达更容易阅读。您的代码存在一些小错误:每次在初始扫描中初始化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。

答案 6 :(得分:0)

from math import ceil, log10

# works for floats, too.
x = [83, 1350, 1, 100, 12.75]
y = [10**ceil(log10(el)) for el in x]

# alt list-comprehension if integers needed
# y = [int(10**ceil(log10(el))) for el in x]