web-dev-qa-db-ja.com

小数点に揃えるように数値をフォーマットする

Pythonでは、次のように、数値を小数点に揃えるようにフォーマットする必要があります。

  4.8
 49.723
456.781
-72.18
  5
 13

これを行うための簡単な方法はありますか?

14
mcu

私は考えていませんあなたの前にすべての数字の小数点の位置を知る必要があるので、それを行う簡単な方法がありますそれらの印刷を開始します。 (Caramirielのリンクとそのページのリンクのいくつかを見たところですが、このケースに特に当てはまるものは見つかりませんでした)。

したがって、リスト内の数値を文字列ベースで検査および操作する必要があるようです。例えば、

def dot_aligned(seq):
    snums = [str(n) for n in seq]
    dots = [s.find('.') for s in snums]
    m = max(dots)
    return [' '*(m - d) + s for s, d in Zip(snums, dots)]

nums = [4.8, 49.723, 456.781, -72.18]

for s in dot_aligned(nums):
    print(s)

出力

  4.8
 49.723
456.781
-72.18

いくつかのプレーンなfloatsが混在したintsのリストを処理する場合、このアプローチは少し面倒になります。

def dot_aligned(seq):
    snums = [str(n) for n in seq]
    dots = []
    for s in snums:
        p = s.find('.')
        if p == -1:
            p = len(s)
        dots.append(p)
    m = max(dots)
    return [' '*(m - d) + s for s, d in Zip(snums, dots)]

nums = [4.8, 49.723, 456.781, -72.18, 5, 13]

for s in dot_aligned(nums):
    print(s)

出力

  4.8
 49.723
456.781
-72.18
  5
 13

更新

Mark Ransomがコメントで指摘しているように、.splitを使用すると、intsの処理を簡素化できます。

def dot_aligned(seq):
    snums = [str(n) for n in seq]
    dots = [len(s.split('.', 1)[0]) for s in snums]
    m = max(dots)
    return [' '*(m - d) + s for s, d in Zip(snums, dots)]
6
PM 2Ring

必要な精度(小数点以下の桁数)がわかっていて、整数を使用するときに末尾のゼロを使用してもかまわない場合は、Pythonで新しいf-stringを使用できます。 3.6( PEP498 ):

numbers = [4.8, 49.723, 456.781, -72.18, 5, 13]

for number in numbers:
    print(f'{number:9.4f}')

プリント:

  4.8000
 49.7230
456.7810
-72.1800
  5.0000
 13.0000
8
artomason

これが私がやった方法です!

def alignDots(number):
    try:
        whole, dec = str(number).split('.')
        numWholeSpaces = 5 - len(whole) # Where 5 is number of spaces you want to theleft
        numDecSpaces   = 3 - len(dec)   # 3 is number of spaces to the right of the dot
        thousands = ' '*numWholeSpaces + whole
        decimals  = dec + '0'*numDecSpaces
        print thousands + '.' + decimals  
        return thousands + '.' + decimals  
    except:
        print "Failed to align dots of ",number
        return ' '*5+'ERROR'

私は他のソリューションが好きですが、何か特定のものが必要で、共有してみませんか?

2
Krowvin

小数点以下の桁数の修正

import decimal

numbers = [4.8, 49.723, 456.781, 50, -72.18, 12345.12345, 5000000000000]

dp = abs(min([decimal.Decimal(str(number)).as_Tuple().exponent for number in numbers]))
width = max([len(str(int(number))) for number in numbers]) + dp + 1 #including .

for number in numbers:
    number = ("{:"+str(width)+"."+str(dp)+"f}").format(number)
    print number.rstrip('0').rstrip('.') if '.' in number else number

リクエストに応じて幅を考慮に入れるように修正:

numbers = [4.8, 49.723, 456.781, 50, -72.18]
width = max([len(str(number)) for number in numbers]) + 1
for number in numbers:
    number = ("{:"+str(width)+".4f}").format(number)
    print number.rstrip('0').rstrip('.') if '.' in number else number

編集:整数を含めたい場合

numbers = [4.8, 49.723, 456.781, 50, -72.18]

for number in numbers:
    number = "{:10.4f}".format(number)
    print number.rstrip('0').rstrip('.') if '.' in number else number

numbers = [4.8, 49.723, 456.781, -72.18]

for number in numbers:
    print "{:10.4f}".format(number).rstrip('0')
2
ooknosi

私はこれにひどく遅れていますが、数学、特に対数の性質を使用して、すべての数値を適切な小数点以下の桁数に埋め込むために必要なスペースの量を計算することもできます。

from math import log10

nums = [4.8, 49.723, 456.781, -72.18, 5, 13]

def pre_spaces(nums):
    absmax = max([abs(max(nums)), abs(min(nums))])
    max_predot = int(log10(absmax))
    spaces = [' '*(max_predot-int(log10(abs(num))) - (1 if num<0 else 0)) for num in nums]
    return spaces

for s,n in Zip(pre_spaces(nums), nums):
    print('{}{}'.format(s,n))

結果は次のとおりです。

  4.8
 49.723
456.781
-72.18
  5
 13
1
JeanOlivier

Pythonドキュメント: https://docs.python.org/2/library/decimal.html#recipes のレシピを使用する

from decimal import Decimal


def moneyfmt(value, places=3, curr='', sep=',', dp='.',
             pos='', neg='-', trailneg=''):
    [...]

numbers = [4.8, 49.723, 456.781, -72.18]
for x in numbers:
    value = moneyfmt(Decimal(x), places=2, pos=" ")
    print("{0:>10s}".format(value))

あなたが得るでしょう:

  4.800
 49.723
456.781
-72.180
1
Laurent LAPORTE

先行ゼロを受け入れることができる場合は、これを使用できます。

numbers = [ 4.8,  49.723, 456.781, -72.18]
    for x in numbers:
    print "{:10.3f}".format(x)

ゼロを先導せずに使用したい場合は、次のように正規表現を使用できます。

Pythonでの10進数の配置フォーマット

ただし、最善の解決策は、小数点の前後の文字列を別々にフォーマットすることです(numstring割り当て)。

numbers = [ 4.8,  49.723, 456.781, -72.18]
nn = [str(X) for X in numbers]

for i in range(len(nn)):
    numstring = "{value[0]:>6}.{value[1]:<6}"
    print numstring.format(value=nn[i].split('.') if '.' in nn[i] else (nn[i], '0'))

次に、文字列を小数点で全体と小数部分として分割できます。小数部分が欠落している場合は、それを0に割り当てます。

注:このソリューションでは、フォーマット操作の前に数値を文字列に変換する必要があります。

これは出力です:

  4.8
 49.723 
456.781 
-72.18  

編集:私はFeebleOldManの solution が私のものよりも優れていると思います、あなたはそれを選ぶべきです。

末尾のゼロを気にしない場合、それを行う簡単な方法は次のとおりです。

numbers = [4.8,49.723,456.781,-72.18,5,13]
for f in numbers:
    print('{:>7.3f}'.format(f))

どの印刷物:

   4.800
  49.723
 456.781
 -72.180
   5.000
  13.000

末尾のゼロを削除したい場合は、正規表現モジュールのre.subメソッドを使用することができます。

import re

numbers = [4.8,49.723,456.781,-72.18,5,13]
for f in numbers:
    print(re.sub(r'\.?0+$','','{:>7.3f}'.format(f)))

どの印刷物:

  4.8
 49.723
456.781
-72.18
  5
 13

ただし、これにより、さまざまな幅の列が得られます。唯一の違いはスペースであるため、表示されませんが、テーブルの一部として実行している場合は、次のようになります。

import re

numbers = [4.8,49.723,456.781,-72.18,5,13]
for f in numbers:
    print(re.sub(r'\.?0+$','','{:>7.3f}'.format(f)),'|')

プリント:

  4.8 |
 49.723 |
456.781 |
-72.18 |
  5 |
 13 |

これを回避するために、本当にファンシーを取得したい場合は、これを行うことができます:

import re

numbers = [4.8,49.723,456.781,-72.18,5,13]
for f in numbers:
    print(re.sub(r'\.?0+$',lambda match: ' '*(match.end()-match.start()),'{:>7.3f}'.format(f)),'|')

どの印刷物:

  4.8   |
 49.723 |
456.781 |
-72.18  |
  5     |
 13     |

お役に立てれば!

1
Wolf Elkan

Python [decimal][1]タイプを使用できます。

金銭的価値をフォーマットするために使用される レシピ があります。

なぜdecimal型:丸めの問題を回避し、重要な数字を正しく処理する...

0
Laurent LAPORTE

はい、浮動小数点数を小数点の周りに揃える直接的な方法はたくさんあります。以下に示す2行のコードは1つの例です

`[20]の場合:floating =([。022,12.645,544.5645、.54646、-554.56、-。2215、-546.5446])

[21]の場合:フローティングのxxxの場合:print "{0:10.4f}"。format(xxx) `

ここ{0:10.4f}では、0は各浮動小数点エントリの次元です。コロンの後のスペースは、オプションのマイナス記号用です。 10は小数点以下の桁数、4は小数点以下の桁数です。これがJPGとしての私の出力です 結果

0
Vipin