Форматирование напротив некоторые числа, с десятичной выравнивание


Фон

У меня есть список строк, содержащих цифры. Каждая строка-8 символов. Например :

'-123.456'
' -12.345'
'  -1.234'
' 123.456'
'  12.345'
'   1.234'

Самое длинное число можно ' 999.999' ; наименьшее число ' 0.000' и там всегда 3 числа в десятичное.

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

Например :

'-123.456' should yield ' 123.456'
' -12.345' should yield '  12.345'
'  -1.234' should yield '   1.234'
' 123.456' should yield '-123.456'
'  12.345' should yield ' -12.345'
'   1.234' should yield '  -1.234'

Что я сделал

Я написал следующий код, который работает :

def opposite(x):
    if x.startswith('  -'):
        xopp = '   ' + x[3:]
    elif x.startswith(' -'):
        xopp = '  ' + x[2:]
    elif x.startswith('-'):
        xopp = ' ' + x[1:]
    elif x.startswith('   '):
        xopp = '  -' + x[3:]
    elif x.startswith('  '):
        xopp = ' -' + x[2:]
    elif x.startswith(' '):
        xopp = '-' + x[1:]
    return xopp

Мой вопрос

Я чувствую, что этот код полностью "unpythonic" и может быть заменен на один-лайнер. Итак, вопрос: кто-нибудь есть идея, чтобы сделать его более подходящие для Python или даже один вкладыш ?



270
4
задан 27 февраля 2018 в 04:02 Источник Поделиться
Комментарии
3 ответа

Есть только две вещи, которые нужно здесь.


  • float. Которая позволяет преобразовывать входное число с плавающей точкой. Если вы измените нуждается в уточнении или больших чисел decimal будет лучшим выбором - спасибо @200_success. И,

  • str.format. Который использует формат строковый синтаксис. Которые вы можете использовать панель слева пробелами, так что выход имеет ширину восемь. {: >8}. Это, однако, нуждается в корректировке для вашего "всегда есть 3 число в десятичное" требования, и так вы можете заставить это слишком с {: >8.3f}.

И поэтому я хотел бы использовать:

def opposite(x):
return '{: >8.3f}'.format(-float(x))


Однако, если вы не хотите использовать float затем вы можете использовать str.lstrip. Только с одним если-то:

def opposite(x):
x = x.lstrip()
if x.startswith('-'):
x = x[1:]
else:
x = '-' + x
return '{: >8}'.format(x)

5
ответ дан 27 февраля 2018 в 05:02 Источник Поделиться

Я обычно болтаться с Python 3.X, но я не думаю, что есть какой-то способ, чтобы сделать это один-лайнер, если вы положили в "если" заявление, нельзя положить в другом "если" заявление, в результате чего "если" утверждение следующей строке про.

Но более эффективный способ, можно наверняка.

0
ответ дан 27 февраля 2018 в 05:02 Источник Поделиться

Существует, безусловно, способ сделать это в один лайнер, на котором я буду размещать, тем не менее, было бы интересно понять, что происходит, и как это сделать

Один лайнер

return str(-1 * float(x.strip()))

Но что происходит?

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

x.strip()  # For an input of '  -35' will return '-35'

Теперь, мы хотим преобразовать число с плавающей точкой, причиной является легче и более подробного расчета отрицательное значение этого пути. Таким образом, мы бросили плавать

float(x.strip())

Затем мы умножаем на -1, чтобы получить обратную

-1 * float(x.strip())

Наконец, нам просто нужно снова привести результат в строку, потому что ваша функция должна возвращать строку как вы указали

str(-1 * float(x.strip()))

0
ответ дан 27 февраля 2018 в 05:02 Источник Поделиться