gpt4 book ai didi

python - Python中的十进制对齐格式

转载 作者:bug小助手 更新时间:2023-10-28 10:49:30 25 4
gpt4 key购买 nike

应该很简单。

这是我的数组(而是一种生成代表性测试数组的方法):

>>> ri = numpy.random.randint
>>> ri2 = lambda x: ''.join(ri(0,9,x).astype('S'))
>>> a = array([float(ri2(x)+ '.' + ri2(y)) for x,y in ri(1,10,(10,2))])
>>> a
array([ 7.99914000e+01, 2.08000000e+01, 3.94000000e+02,
4.66100000e+03, 5.00000000e+00, 1.72575100e+03,
3.91500000e+02, 1.90610000e+04, 1.16247000e+04,
3.53920000e+02])

我想要 '\n'.join(list_o_strings) 将打印的字符串列表:

   79.9914
20.8
394.0
4661.0
5.0
1725.751
391.5
19061.0
11624.7
353.92

我想在左边在右边(但没有必要)填充空格。

如果小数点后只有一个零,我希望小数点后有一个零。

我不想要科学记数法。

..我不想丢失任何有效数字。 (在 353.98000000000002 中,2 不重要)

是的,很高兴想要..

Python 2.5 的 %g、%fx.x 等要么让我迷惑,要么做不到。我还没有尝试过 import decimal。我看不到 NumPy也可以(尽管 array.__str__array.__repr__ 是十进制对齐的(但有时返回科学)。

哦,速度很重要。我在这里处理大数组。

我目前的解决方法是:

  1. 到 str(a) 并解析 NumPy 的括号
  2. str(e) 数组中的每个元素并 split('.') 然后填充和重构
  3. 到 a.astype('S'+str(i)) 其中 i 是 max(len(str(a))),然后填充

似乎应该有一些现成的解决方案......(但不是必需的)

dtype 为 float64 时,最佳建议失败:

>>> a
array([ 5.50056103e+02, 6.77383566e+03, 6.01001513e+05,
3.55425142e+08, 7.07254875e+05, 8.83174744e+02,
8.22320510e+01, 4.25076609e+08, 6.28662635e+07,
1.56503068e+02])
>>> ut0 = re.compile(r'(\d)0+$')
>>> thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]
>>> print '\n'.join(thelist)
550.056103
6773.835663
601001.513
355425141.8471
707254.875038
883.174744
82.232051
425076608.7676
62866263.55
156.503068

最佳答案

抱歉,经过彻底调查,我找不到任何方法来执行您需要的任务,而无需进行最少的后期处理(去除您不想看到的尾随零);类似:

import re
ut0 = re.compile(r'(\d)0+$')

thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]

print '\n'.join(thelist)

快速而简洁,但打破了您“现成”的限制——相反,它是通用格式的模块化组合(几乎可以满足您的需求,但留下您想要隐藏的尾随零)和一个 RE 来删除不需要的尾随零。实际上,我认为它完全符合您的要求,但我认为您所述的条件过于受限。

编辑:对原始问题进行了编辑以指定更多有效数字,不需要超出最大数字所需的额外前导空格,并提供一个新示例(我之前的建议,上面,没有' t 匹配所需的输出)。最好使用 textwrap.dedent 执行删除一组字符串常见的前导空格的工作。 - 但这适用于单个字符串(带有换行符),而所需的输出是字符串列表。没问题,我们只需将线条放在一起,将它们消去,然后再将它们分开:

import re
import textwrap

a = [ 5.50056103e+02, 6.77383566e+03, 6.01001513e+05,
3.55425142e+08, 7.07254875e+05, 8.83174744e+02,
8.22320510e+01, 4.25076609e+08, 6.28662635e+07,
1.56503068e+02]

thelist = textwrap.dedent(
'\n'.join(ut0.sub(r'\1', "%20f" % x) for x in a)).splitlines()

print '\n'.join(thelist)

发射:

      550.056103
6773.83566
601001.513
355425142.0
707254.875
883.174744
82.232051
425076609.0
62866263.5
156.503068

关于python - Python中的十进制对齐格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1025379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com