web-dev-qa-db-ja.com

Pythonでフロートを簡単にきれいに印刷しますか?

フロートのリストがあります。単に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]
78
static_rtti

それは古い質問ですが、潜在的に有用なものを追加します:

サンプルを未加工のPythonリストに書いたのは知っていますが、代わりにnumpy配列を使用することにした場合(数値の配列を扱っているように見えるので、この例では完全に合法です) )、あなたが作った(ほぼ正確に)このコマンドがあります:

import numpy as np
np.set_printoptions(precision=2)

または、本当に正確な数値の小数部をすべて表示したいが、たとえば末尾のゼロを削除したい場合は、フォーマット文字列%gを使用することをお勧めします。

np.set_printoptions(formatter={"float_kind": lambda x: "%g" % x})

一度だけ印刷し、グローバルな動作を変更しない場合は、np.array2stringを上記と同じ引数で使用します。

16
PlasmaBinturong

誰もそれを追加していないので、Python 2.6+から進むために推奨される string formatingformat で、 Python 3+の準備ができました。

print ["{0:0.2f}".format(i) for i in a]

新しい文字列のフォーマット構文 は使いにくいものではありませんが、非常に強力です。

私はそれは pprint かもしれないが、何かを持っているかもしれないが、私は何も見つけていない。

90
Esteban Küber

より永続的な解決策は、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]よりもはるかに簡潔です。

75
Robert Rossney

できるよ:

a = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
print ["%0.2f" % i for i in a]
37

「%.2f」のような文字列を乗算することもできます(例:「%。2f」* 10)。

>>> print "%.2f "*len(yourlist) % Tuple(yourlist)
2.00 33.00 4.42 0.31 
22
dalloliogm
print "[%s]"%", ".join(map(str,yourlist))

これにより、固定精度制約("%.2f"を使用した書式設定など)を導入することなく、印刷時にバイナリ表現の丸めエラーが回避されます。

[9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.0793303]
8
fortran

最も簡単なオプションは、丸めルーチンを使用することです。

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]
5
Markus Dutschke

Python 3.1は、デフォルトで、コードを変更せずに、よりきれいに印刷すると信じています。しかし、Python 3.1で動作するように更新されていない拡張機能を使用する場合、それは役に立ちません

4
Echo
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
4
Chikipowpow

リストカンプはあなたの友達です。

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
4
Jed Smith

パンダを使用できます。

リストを使用した例を次に示します。

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')
3
ifmihai

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はジェネレーターを単に置き換えました...

2
kitsu.eb

最初に、コレクション内の要素は、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)
2
u0b34a0f6ae

有効な桁の数を制御するには、書式指定子%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]
1
Rainald62

私はこの問題を抱えていましたが、ここの解決策はどれもしませんでした正確に私が望んだもの(印刷出力を有効な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()がより標準的なソリューションであるはずですが、これはより読みやすいと思います)

1
Emile

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<--
1
x0s

以下のコードは私にとってはうまく機能します。

list = map (lambda x: float('%0.2f' % x), list)
0
Romerito