我需要一些科学表示法中的浮点字符串,如['5e-6','1e-5','1.5e-5','2e-5','2.5e-5',...]
。
所以我尝试用[str(n*1e-6) for n in list(range(5,60,5))]
生成它们,但它给出了['4.9999999999999996e-06', '9.999999999999999e-06', '1.4999999999999999e-05',...]
。
然后我尝试用["{:.1e}".format(n*1e-6) for n in list(range(5,60,5))]
格式化它们,它给出的['5.0e-06', '1.0e-05', '1.5e-05', '2.0e-05', '2.5e-05',...]
仍然不是我想要的。
我想知道除了编写自定义函数之外,还有什么简单的方法可以做到这一点吗?谢谢
您可以用e
替换.0e
部分。
["{:.1e}".format(n*1e-6).replace(".0e", "e") for n in list(range(5,60,5))]
这提供
['5e-06', '1e-05', '1.5e-05', '2e-05', '2.5e-05', '3e-05', '3.5e-05', '4e-05', '4.5e-05', '5e-05', '5.5e-05']
这仍然留下指数中的前导零。为了消除这种情况,我们可以使用一个正则表达式:
(e-?)0(d+)
说明:https://regex101.com/r/8bXvDH/1
(e-?)
:匹配文字e
,后跟可选减号。捕获组10
:匹配文字零(d+)
:匹配一个或多个数字。捕获组2
要进行替换,我们使用re.sub()
:
# 12 in the replace string means capturing group 1, then capturing group 2
re.sub(r"(e-?)0(d+)", r"12", "5e-06") # Gives "5e-6"
在我们的列表中压缩:
[re.sub(r"(e-?)0(d+)", r"12", "{:.1e}".format(n*1e-6).replace(".0e", "e")) for n in list(range(5,60,5))]
提供我们想要的:
['5e-6', '1e-5', '1.5e-5', '2e-5', '2.5e-5', '3e-5', '3.5e-5', '4e-5', '4.5e-5', '5e-5', '5.5e-5']
这适用于您的特定示例,但请注意,它是非常硬编码的:
["{:.0e}".format(n*1e-6) if not n%10 or n<10 else "{:.1e}".format(n*1e-6) for n in list(range(5,60,5))]
在这里,您可以更改不想用任何小数部分显示的数字的格式,但仍然可以正确显示x.5数字。该代码为5做了一个例外,否则它将打印一个十进制。
这是一个完全解决您问题的版本-它还删除了指数中尾随的0:
["{:.0e}".format(n*1e-6).replace("e-0", "e-") if not n%10 or n<10 else "{:.1e}".format(n*1e-6).replace("e-0", "e-") for n in list(range(5,60,5))]
replace
技巧来自这篇文章——正如文章中所说,您需要将其扩展到e+0
。