Вопрос

Этот должен расслабьтесь.

Вот мой массив (вернее, метод создания репрезентативных тестовых массивов):

>>> ri = numpy.random.randint
>>> ri2 = lambda x: ''.join(ri(0,9,x).astype('S'))
>>> a = array([float(ri2(x)+ '.' + ri2(y)) for x,y in ri(1,10,(10,2))])
>>> a
array([  7.99914000e+01,   2.08000000e+01,   3.94000000e+02,
         4.66100000e+03,   5.00000000e+00,   1.72575100e+03,
         3.91500000e+02,   1.90610000e+04,   1.16247000e+04,
         3.53920000e+02])

Мне нужен список строк, в которых будет печататься ' '.join(list_o_strings):

   79.9914
   20.8
  394.0
 4661.0
    5.0
 1725.751
  391.5
19061.0
11624.7
  353.92

Я хочу переместить панель слева и правильно (но не более чем необходимо).

Мне нужен ноль после запятой, если это все, что стоит после запятой.

Мне не нужны научные обозначения.

..и я не хочу потерять какие-либо значащие цифры.(в 353.98000000000002 2 не имеет значения)

Да, приятно хотеть..

Питон 2.5 %g, %fx.x, и т. д.либо сбивают меня с толку, либо не могут этого сделать.я не пробовал import decimal еще.я этого не вижу NumPy тоже это делает (хотя array.__str__ и array.__repr__ выровнены по десятичному принципу (но иногда возвращаются в научном формате).

Да, и скорость имеет значение.Здесь я имею дело с большими массивами.

Мои текущие подходы к решению:

  1. для str(a) и анализа скобок NumPy
  2. для str(e) каждого элемента массива и разделения('.'), затем дополняем и восстанавливаем
  3. в a.astype('S'+str(i)) где i - max(len(str(a))), затем заполните

Кажется, должно быть какое-то готовое решение...(но не обязательно)

Лучшее предложение не работает, если указано, когда dtype это float64:

>>> a
array([  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])
>>> ut0 = re.compile(r'(\d)0+$')
>>> thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]
>>> print '\n'.join(thelist)
  550.056103
 6773.835663
601001.513
355425141.8471
707254.875038
  883.174744
   82.232051
425076608.7676
62866263.55
  156.503068
Это было полезно?

Решение

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

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)

излучает:

      550.056103
     6773.83566
   601001.513
355425142.0
   707254.875
      883.174744
       82.232051
425076609.0
 62866263.5
      156.503068

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top