Форматирование выравнивания десятичных чисел в Python

Это зависит от того, хотите ли вы узнать, существует ли он в одном из каталогов в переменной $PATH или знаете ли вы его абсолютное местоположение. Если вы хотите узнать, находится ли она в переменной $PATH, используйте

if which programname >/dev/null; then
    echo exists
else
    echo does not exist
fi

, в противном случае используйте

if [ -x /path/to/programname ]; then
    echo exists
else
    echo does not exist
fi

Перенаправление на /dev/null/ в первом примере подавляет вывод which программа.

8
задан Peter Mortensen 11 December 2010 в 12:51
поделиться

2 ответа

Извините, но после тщательного расследования я не могу найти способ выполнить требуемую задачу без минимальной пост-обработки (чтобы убрать нули в конце, которые вы не хотите видеть ); что-то вроде:

import re
ut0 = re.compile(r'(\d)0+$')

thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]

print '\n'.join(thelist)

является быстрым и кратким, но нарушает ваше ограничение быть готовым к использованию - вместо этого это модульная комбинация общего форматирования (которая почти делает то, что вы хотите, но оставляет конечный ноль, который вы хотите для скрытия) и RE для удаления нежелательных конечных нулей. На практике я думаю, что он делает именно то, что вам нужно, но ваши условия, как я полагаю, чрезмерно ограничены.

Изменить : исходный вопрос был отредактирован, чтобы указать более значащие цифры, не требует дополнительного начального пробела, кроме того, что требуется для наибольшего числа, и приведите новый пример (где мое предыдущее предложение выше, не соответствует желаемому результату). Работу по удалению начальных пробелов, которые являются общими для группы строк, лучше всего выполнять с помощью textwrap.dedent - но это работает с одной строкой (с символами новой строки), в то время как требуемый вывод представляет собой список строк. Нет проблем, мы просто соединим строки, разделим их и снова разделим:

import re
import textwrap

a = [  5.50056103e+02,   6.77383566e+03,   6.01001513e+05,
         3.55425142e+08,   7.07254875e+05,   8.83174744e+02,
         8.22320510e+01,   4.25076609e+08,   6.28662635e+07,
         1.56503068e+02]

thelist = textwrap.dedent(
        '\n'.join(ut0.sub(r'\1', "%20f" % x) for x in a)).splitlines()

print '\n'.join(thelist)

emits:

      550.056103
     6773.83566
   601001.513
355425142.0
   707254.875
      883.174744
       82.232051
425076609.0
 62866263.5
      156.503068
10
ответ дан 5 December 2019 в 14:06
поделиться

Форматирование строк в Pythons может выводить только необходимые десятичные знаки (с% g) или использовать фиксированный набор десятичных знаков (с% f). Однако вы хотите распечатать только необходимые десятичные дроби, за исключением случаев, когда число является целым числом, тогда вам нужна одна десятичная дробь, и это делает его сложным.

Это означает, что в итоге вы получите что-то вроде:

def printarr(arr):
    for x in array:
        if math.floor(x) == x:
            res = '%.1f' % x
        else:
            res = '%.10g' % x
        print "%*s" % (15-res.find('.')+len(res), res)

Это сначала создаст строку либо с 1 десятичным знаком, если значение является целым числом, либо он будет печатать с автоматическими десятичными знаками (но только до 10 чисел), если это не дробное число. Наконец, он распечатает его, настроив так, чтобы десятичная точка была выровнена.

Возможно, однако, numpy действительно делает то, что вы хотите, потому что вы обычно хотите, чтобы он был в экспоненциальном режиме, если он слишком длинный.

2
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: