簡體   English   中英

Python中的十進制對齊格式

[英]Decimal alignment formatting in Python

應該很容易。

這是我的數組(相反,一種生成代表性測試數組的方法):

>>> 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)數組中的每個元素並拆分('。')然后填充和重建
  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刪除不需要的尾隨零。 實際上,我認為它完全符合您的要求,但我認為您所陳述的條件過度約束。

編輯編輯原始問題以指定更多有效數字,不需要超出最大數字所需的額外前導空間,並提供一個新示例(上面我的上一個建議與所需輸出不匹配)。 刪除對一串字符串通用的前導空格的工作最好使用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

Pythons字符串格式化既可以打印出必要的小數(使用%g),也可以使用一組固定的小數(使用%f)。 但是,您只想打印出必要的小數,除非數字是整數,那么您需要一個小數,這使得它很復雜。

這意味着你最終會得到類似的東西:

def printarr(arr):
    for x in array:
        if math.floor(x) == x:
            res = '%.1f' % x
        else:
            res = '%.10g' % x
        print "%*s" % (15-res.find('.')+len(res), res)

這將首先創建一個帶有1個十進制的字符串,如果該值是整數,或者如果它不是小數,它將使用自動小數打印(但最多只能打印10個數字)。 最后它將打印它,調整以使小數點對齊。

但是,numpy實際上可以做你想要的,因為如果它太長,你通常會希望它處於指數模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM