Pythonでは、次のように、数値を小数点に揃えるようにフォーマットする必要があります。
4.8
49.723
456.781
-72.18
5
13
これを行うための簡単な方法はありますか?
私は考えていませんあなたの前にすべての数字の小数点の位置を知る必要があるので、それを行う簡単な方法がありますそれらの印刷を開始します。 (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
いくつかのプレーンなfloat
sが混在したint
sのリストを処理する場合、このアプローチは少し面倒になります。
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
を使用すると、int
sの処理を簡素化できます。
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)]
必要な精度(小数点以下の桁数)がわかっていて、整数を使用するときに末尾のゼロを使用してもかまわない場合は、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
これが私がやった方法です!
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'
私は他のソリューションが好きですが、何か特定のものが必要で、共有してみませんか?
小数点以下の桁数の修正
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')
私はこれにひどく遅れていますが、数学、特に対数の性質を使用して、すべての数値を適切な小数点以下の桁数に埋め込むために必要なスペースの量を計算することもできます。
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
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
先行ゼロを受け入れることができる場合は、これを使用できます。
numbers = [ 4.8, 49.723, 456.781, -72.18]
for x in numbers:
print "{:10.3f}".format(x)
ゼロを先導せずに使用したい場合は、次のように正規表現を使用できます。
ただし、最善の解決策は、小数点の前後の文字列を別々にフォーマットすることです(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 |
お役に立てれば!
Python [decimal][1]
タイプを使用できます。
金銭的価値をフォーマットするために使用される レシピ があります。
なぜdecimal
型:丸めの問題を回避し、重要な数字を正しく処理する...
はい、浮動小数点数を小数点の周りに揃える直接的な方法はたくさんあります。以下に示す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としての私の出力です 結果