Python 如何改进此代码? #max_list=[831350,1100] 对于范围内的i(len(max_列表)): 新的_值=1 当新值100,1->11350->10000,100->100。我尝试使用round()函数,但无法让它执行我想要的操作

Python 如何改进此代码? #max_list=[831350,1100] 对于范围内的i(len(max_列表)): 新的_值=1 当新值100,1->11350->10000,100->100。我尝试使用round()函数,但无法让它执行我想要的操作,python,rounding,Python,Rounding,我所做的是把数字四舍五入到最接近的,嗯,零填充值?我不知道它叫什么。但基本上,我想要83->100,1->11350->10000,100->100。我尝试使用round()函数,但无法让它执行我想要的操作 这样做了,但我认为可以用更少的行来编写。def nextpowerroften(x): # max_list = [83, 1350, 1, 100] for i in range(len(max_list)): new_value = 1 while new_value

我所做的是把数字四舍五入到最接近的,嗯,零填充值?我不知道它叫什么。但基本上,我想要83->100,1->11350->10000,100->100。我尝试使用round()函数,但无法让它执行我想要的操作

这样做了,但我认为可以用更少的行来编写。

def nextpowerroften(x):
# 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
如果[0,1]中的x: 返回x elif x<1: 返回-下一个动力输出(abs(x)) 其他: 返回10**len(str(int(x)-1)) >>>nextPowerOfTen(83) 100 >>>nextPowerOfTen(1350) 10000 >>>下一动力(1) 1. >>>nextPowerOfTen(100) 100 >>>下一个电源(0) 0 >>>下一个电源(-1) -1 >>>下一个电源(-2) -10
它用消极的东西做一些合理的事情,不确定这是否是你想要的行为

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

你一开始为什么不这么说

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
除非您还需要其他数字?

伪代码:

new_val = float("0." + str(old_val))
>>> x = 12345.678
>>> y = round(x)
>>> round(10 * y, -len(str(y)))
100000

我会用数学的方法来做:

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

您的原始代码非常接近,并且比一些简洁的表达式更容易阅读。代码的问题是有几个小错误:在初始扫描中每次初始化
新的\u值
,而不是只初始化一次;并用计算的标量替换
max\u列表
,同时将其作为列表循环

在最后一行,您必须打算:

from math import ceil, log10
int(pow(10, ceil(log10(abs(x or 0.1)))))
但是您删除了数组索引,它将用单个值替换列表。在循环的第二次迭代中,您的Python将给出一个异常,因为非列表中的索引无效

由于您的代码在运行过程中会产生越来越多的新值,因此我建议您不要在第一次扫描期间替换列表项。计算新_值的最终值后,进行第二次扫描:

    max_list[i] = float(max_list[i]) / new_value
max_list=[831350,1100]
#计算所需的10的“正常化”功率
新的_值=1.0
对于范围内的i(len(max_列表)):
当新值<最大值列表[i]时:
新的_值*=10.0
#将值转换为[0.0,1.0]中的分数
对于范围内的i(len(max_列表)):
最大值列表[i]=最大值列表[i]/新值
打印最大值列表
# "[0.0083000000000000001, 0.13500000000000001, 0.0001, 0.01]"

请注意,我需要初始化新的_值,就像它是一个浮点值一样,以便生成浮点商。有其他方法可以做到这一点,例如使用
float(max\u list[i])
来检索用于规范化的值。
new_value
的原始计算是从每个元素开始的,因此您的示例将返回
new_value==100
,因为这是基于输入列表中的最后一个元素,即100。

否,我希望它变为10000。稍后我将用这些数字除以这些值。我需要它是1350/10000=0.135,所以它在[0,1]范围内。你想要所有的数字都标准化为相同的十次方,对吗?你不需要为
新的\u值使用不同的表达式,你需要两个过程。你可能想使用float(),而不是int()。我也在使用浮点-我忘了提到它-所以我想我必须删除分隔符。但是这看起来对1来说是可行的,
1->0.1
应该是
1->1
?@Bwmat:修复了,谢谢@斯蒂芬:是的。然而,[0,1]实际上是一个有趣的使用范围-[0,1)通常更有用。我想看看@iceburn打算如何使用这些“标准化”值。不过,它对浮点不起作用。我忘了提到sorryFixed在10次幂上的故障我会使用
pow(10,ceil(abs(log10(x)))
对于负输入。+1,看看你,在其他人带来字符串处理的情况下,你带来了智能:)而零是一个微不足道的特例…不要忘记从
数学
导入
*
(或者至少
pow
ceil
log10
int(pow(10,ceil(log10(abs(x)或0.1))))
对于x<1更好的建议,将它们添加到答案中。max_列表具有文件中每列的最大值。更改值后,我将每个元素除以其各自的最大值,例如,如果我的文件中的第一行是:10、10、20、30,并且我的最大值是10、100、100、1000,我将有1、0.1、0.2、0.03作为新的第一行。我发布的代码只显示了我所做工作的一部分,即取最大值并四舍五入。在这种情况下,您原始代码的唯一错误是我所做的“最后一行”注释。:)
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]"
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]