フロートのリストがあります。単にprint
itとすると、次のように表示されます。
[9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
リストを走査するにはfor
ループを必要とするprint "%.2f"
を使用できますが、より複雑なデータ構造では機能しません。次のようなものが欲しい(これは完全に作り上げている)
>>> import print_options
>>> print_options.set_float_precision(2)
>>> print [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
[9.0, 0.05, 0.03, 0.01, 0.06, 0.08]
それは古い質問ですが、潜在的に有用なものを追加します:
サンプルを未加工のPythonリストに書いたのは知っていますが、代わりにnumpy
配列を使用することにした場合(数値の配列を扱っているように見えるので、この例では完全に合法です) )、あなたが作った(ほぼ正確に)このコマンドがあります:
import numpy as np
np.set_printoptions(precision=2)
または、本当に正確な数値の小数部をすべて表示したいが、たとえば末尾のゼロを削除したい場合は、フォーマット文字列%g
を使用することをお勧めします。
np.set_printoptions(formatter={"float_kind": lambda x: "%g" % x})
一度だけ印刷し、グローバルな動作を変更しない場合は、np.array2string
を上記と同じ引数で使用します。
誰もそれを追加していないので、Python 2.6+から進むために推奨される string formating は format
で、 Python 3+の準備ができました。
print ["{0:0.2f}".format(i) for i in a]
新しい文字列のフォーマット構文 は使いにくいものではありませんが、非常に強力です。
私はそれは pprint
かもしれないが、何かを持っているかもしれないが、私は何も見つけていない。
より永続的な解決策は、float
をサブクラス化することです:
>>> class prettyfloat(float):
def __repr__(self):
return "%0.2f" % self
>>> x
[1.290192, 3.0002, 22.119199999999999, 3.4110999999999998]
>>> x = map(prettyfloat, x)
>>> x
[1.29, 3.00, 22.12, 3.41]
>>> y = x[2]
>>> y
22.12
サブクラス化float
の問題は、変数の型を明示的に探しているコードを壊すことです。しかし、私が知る限り、それが唯一の問題です。そして、単純なx = map(float, x)
はprettyfloat
への変換を取り消します。
悲惨なことに、float
は不変であるため、float.__repr__
だけをモンキーパッチすることはできません。
float
をサブクラス化したくないが、関数の定義を気にしない場合、map(f, x)
は[f(n) for n in x]
よりもはるかに簡潔です。
できるよ:
a = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
print ["%0.2f" % i for i in a]
「%.2f」のような文字列を乗算することもできます(例:「%。2f」* 10)。
>>> print "%.2f "*len(yourlist) % Tuple(yourlist)
2.00 33.00 4.42 0.31
print "[%s]"%", ".join(map(str,yourlist))
これにより、固定精度制約("%.2f"
を使用した書式設定など)を導入することなく、印刷時にバイナリ表現の丸めエラーが回避されます。
[9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.0793303]
最も簡単なオプションは、丸めルーチンを使用することです。
import numpy as np
x=[9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
print('standard:')
print(x)
print("\nhuman readable:")
print(np.around(x,decimals=2))
これにより、出力が生成されます。
standard:
[9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.0793303]
human readable:
[ 9. 0.05 0.03 0.01 0.06 0.08]
Python 3.1は、デフォルトで、コードを変更せずに、よりきれいに印刷すると信じています。しかし、Python 3.1で動作するように更新されていない拡張機能を使用する場合、それは役に立ちません
l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
Python 2:
print ', '.join('{:0.2f}'.format(i) for i in l)
Python 3:
print(', '.join('{:0.2f}'.format(i) for i in l))
出力:
9.00, 0.05, 0.03, 0.01, 0.06, 0.08
リストカンプはあなたの友達です。
print ", ".join("%.2f" % f for f in list_o_numbers)
それを試してみてください:
>>> nums = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999]
>>> print ", ".join("%.2f" % f for f in nums)
9.00, 0.05, 0.03, 0.01
パンダを使用できます。
リストを使用した例を次に示します。
In: import pandas as P
In: P.set_option('display.precision',3)
In: L = [3.4534534, 2.1232131, 6.231212, 6.3423423, 9.342342423]
In: P.Series(data=L)
Out:
0 3.45
1 2.12
2 6.23
3 6.34
4 9.34
dtype: float64
辞書dがあり、そのキーを行として使用する場合:
In: d
Out: {1: 0.453523, 2: 2.35423234234, 3: 3.423432432, 4: 4.132312312}
In: P.DataFrame(index=d.keys(), data=d.values())
Out:
0
1 0.45
2 2.35
3 3.42
4 4.13
DataFrameにdictを与える別の方法:
P.DataFrame.from_dict(d, orient='index')
Pprintを使用してfloatのタプルのリストを出力しようとしたときに、この問題に遭遇しました。入れ子になった理解は悪い考えかもしれませんが、私がしたことは次のとおりです。
tups = [
(12.0, 9.75, 23.54),
(12.5, 2.6, 13.85),
(14.77, 3.56, 23.23),
(12.0, 5.5, 23.5)
]
pprint([['{0:0.02f}'.format(num) for num in tup] for tup in tups])
最初はジェネレーター式を使用しましたが、pprintはジェネレーターを単に置き換えました...
最初に、コレクション内の要素は、reprを出力します。 __repr__
と__str__
について学ぶ必要があります。
これは、print repr(1.1)とprint 1.1の違いです。表現の代わりにこれらすべての文字列を結合しましょう:
numbers = [9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.07933]
print "repr:", " ".join(repr(n) for n in numbers)
print "str:", " ".join(str(n) for n in numbers)
有効な桁の数を制御するには、書式指定子%gを使用します。
エミールのソリューションをprettylist2fと名付けましょう。変更されたものは次のとおりです。
prettylist2g = lambda l : '[%s]' % ', '.join("%.2g" % x for x in l)
使用法:
>>> c_e_alpha_eps0 = [299792458., 2.718281828, 0.00729735, 8.8541878e-12]
>>> print(prettylist2f(c_e_alpha_eps0)) # [299792458.00, 2.72, 0.01, 0.00]
>>> print(prettylist2g(c_e_alpha_eps0)) # [3e+08, 2.7, 0.0073, 8.9e-12]
有効桁数に柔軟性が必要な場合は、代わりに f-string formating を使用します。
prettyflexlist = lambda p, l : '[%s]' % ', '.join(f"{x:.{p}}" for x in l)
print(prettyflexlist(3,c_e_alpha_eps0)) # [3e+08, 2.72, 0.0073, 8.85e-12]
私はこの問題を抱えていましたが、ここの解決策はどれもしませんでした正確に私が望んだもの(印刷出力を有効なpython式にしたい)
prettylist = lambda l : '[%s]' % ', '.join("%.2f" % f for f in l)
使用法:
>>> ugly = [9.0, 0.052999999999999999, 0.032575399999999997,
0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
>>> prettylist = lambda l : '[%s]' % ', '.join("%.2f" % f for f in l)
>>> print prettylist(ugly)
[9.00, 0.05, 0.03, 0.01, 0.06, 0.08]
(.format()がより標準的なソリューションであるはずですが、これはより読みやすいと思います)
Python 3.6以降、f文字列を使用できます。
list_ = [9.0, 0.052999999999999999,
0.032575399999999997, 0.010892799999999999,
0.055702500000000002, 0.079330300000000006]
print(*[f"{element:.2f}" for element in list_])
#9.00 0.05 0.03 0.01 0.06 0.08
コードを非常に読みやすく保ちながら、印刷パラメーターを使用できます。
print(*[f"{element:.2f}" for element in list_], sep='|', end='<--')
#9.00|0.05|0.03|0.01|0.06|0.08<--
以下のコードは私にとってはうまく機能します。
list = map (lambda x: float('%0.2f' % x), list)