# 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()函数,但无法按照我想要的那样去做。
这样做但是我认为它可以写成更少的行。
答案 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]