Легкая симпатичная печать поплавков в python?


у меня есть список поплавки. Если я просто print это, это выглядит так:

[9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]

я мог бы использовать print "%.2f" С for петли для обхода списка, но тогда он не будет работать для более сложных структур данных. Я бы хотел что-то вроде (я полностью это придумываю)

>>> 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]
18 68

18 ответов:

Это старый вопрос, но я бы добавил что-то потенциально полезное:

Я знаю, что вы написали свой пример в необработанных списках 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 + рекомендуемый способ сделать строка форматирования С 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.__repr__, потому что floatс неизменным.

если вы не хотите подкласс 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]

Я считаю, что Python 3.1 будет печатать их лучше по умолчанию, без каких-либо изменений кода. Но это бесполезно, если вы используете любые расширения, которые не были обновлены, чтобы работать с Python 3.1

список comps ваш друг.

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

самым простым вариантом должно быть использование процедуры округления:

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]

вы могли бы использовать панд.

вот пример списка:

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

и еще один способ дать dict фрейму данных:

P.DataFrame.from_dict(d, orient='index')
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

во-первых, элементы внутри коллекции печатают их 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)

Я просто столкнулся с этой проблемой при попытке использовать печатные для вывода списка кортежей поплавков. Вложенные понимания могут быть плохой идеей, но вот что я сделал:

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 просто повторил генератор...

у меня была эта проблема, но ни одно из решений здесь не было ровно что я хотел (я хочу, чтобы печатный вывод был действительным выражением 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]

(Я знаю .формат () должен быть более стандартным решением, но я нахожу это более читаемым)

код ниже работает хорошо для меня.

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

для управления количеством значительное цифры, используйте спецификатор формата %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-строки вместо:

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

Я согласен с комментарием SilentGhost, цикл for не так уж плох. Вы можете достичь того, что вы хотите с:

l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
for x in l: print "%0.2f" % (x)