をAllignまあまあのように、私は、彼らが小数点に合わせるように、数値をフォーマットする必要があります。の書式番号彼らは、Pythonの小数点で
4.8
49.723
456.781
-72.18
5
13
はこれを行うにはstraighforward方法はありますか?
をAllignまあまあのように、私は、彼らが小数点に合わせるように、数値をフォーマットする必要があります。の書式番号彼らは、Pythonの小数点で
4.8
49.723
456.781
-72.18
5
13
はこれを行うにはstraighforward方法はありますか?
私はしないあなたが印刷を開始する前に、すべての数字の小数点の位置を知る必要があるので、それを行うには簡単な方法があります。 (私はちょうど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
あなたが混入いくつかの平野int
sのfloat
のリストを処理したい場合は、このアプローチは、ビット乱雑を取得します。
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
更新
マーク身代金はコメントで指摘するように、我々は.split
を使用してint
の取り扱い簡素化することができます:
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)]
代わりs.find 'の(」。 ') 'len(s.split('。 ')[0])'を使うことができます。 –
@ MarkRansom:なぜ、私はそれを考えなかったのですか? :)ありがとう! –
あなたはこの使用できるいくつかの先行ゼロ受け入れることができる場合:
Decimal alignment formatting in Python
しかし最高:あなたがゼロを招くことなく好む場合は、この方法で正規表現を使用することができます
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は私よりも優れている、あなたがそれを選ぶべきだと思います。小数点以下の桁数
修正要求に考慮に幅を取るために修正さ
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
EDIT:あなたは整数
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')
あなたは、Python [decimal][1]
タイプを使用することができます。
金額の書式設定にはrecipeが使用されています。 Pythonのドキュメントのレシピを使用して、丸めの問題を避けるため、正しくシニフィアン数字を扱う...
この質問に関連する例を表示できますか? decimal型を使用して小数点に揃えられた数値のリストを適切にフォーマットする方法を理解できませんでした。 –
はい、できますが、レシピを読んでもらえますか? –
私はゼロを導くことを避ける必要があることを理解しました。いずれにしても、[ここ](http://meta.stackoverflow.com/questions/251070/are-multiple-answers-by-theame-user-acceptable?rq=1)に記載されているように、複数の回答を避けるべきだと思います。 )。 –
:
なぜdecimal
タイプ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
ええと、このコードはそのままでは動作しません - Python 3.4.3。 * TypeError:オブジェクトに渡される空でない書式文字列.__形式__ * – mcu
Py3を使用する場合は、Py3のドキュメントを参照してください。https://docs.python.org/3/library/decimal.html#recipes –
私はこれに非常に遅れていますが、数学、特に対数の性質を使って、あなたの空間の量を計算することもできますすべての数字を適切な小数点以下の桁に貼り付けます。
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
関連:https://stackoverflow.com/questions/1025379/decimal-alignment-formatting-in-python – Caramiriel