Отображение числа с ведущими нулями

Дано:

a = 1
b = 10
c = 100

Как отобразить начальный ноль для всех чисел, состоящих менее чем из двух цифр?

Это результат, которого я ожидаю:

01
10
100
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1 033
0
957 307
17
Перейти к ответу Данный вопрос помечен как решенный

Ответы 17

x = [1, 10, 100]
for i in x:
    print '%02d' % i

приводит к:

01
10
100

Прочтите больше информации о форматировании строк с помощью% в документации.

Пример документации - отстой. Они добавляют отображение с начальным нулевым отсчетом, поэтому трудно понять, что есть что, если вы еще не знаете, как это работает. Собственно, именно это и привело меня сюда.

Grant 01.07.2009 21:52
Ответ принят как подходящий

В Python 2 (и Python 3) вы можете:

print "%02d" % (1,)

В основном % похож на printf или sprintf (см. документы).


Для Python 3. + такое же поведение может быть достигнуто с помощью format:

print("{:02d}".format(1))

Для Python 3.6+ такого же поведения можно добиться с помощью ф-струны:

print(f"{1:02d}")

Пример: выведите "% 05d"% result ['postalCode'] для 5-значного почтового индекса.

Nick Woodhams 05.06.2012 16:08

x = "%02d.txt" % i вызывает TypeError (не может объединять объекты 'str' и 'int'), а x = "%02d.txt" % (i,) - нет. Интересно. Интересно, где это задокументировано

theta 05.11.2012 22:10

@theta В 2.7.6 я не получаю сообщения об ошибке. Может быть, это была ошибка в конкретной версии Python, которую они с тех пор исправили?

Jack M. 04.04.2014 18:51

Может быть. В 2.7.6 нет исключения, если значение формата не является кортежем (по крайней мере, для этого примера). Глядя на дату моего комментария, я полагаю, что тогда я работал с 2.7.3, и в то время я не знал, что включение одной переменной в кортеж обеспечивает безопасность при использовании средства форматирования строк %.

theta 04.04.2014 19:41

Чтобы уточнить, документы объясняет это здесь: «Когда не задано явное выравнивание, предшествующий полю ширины символ нуля ('0') включает знаковое заполнение нулями для числовых типов. Это эквивалентно символу заполнения ' 0 'с типом выравнивания' = '. "

JHS 30.03.2016 22:48

Что, если я хочу, чтобы 2 в :02 был переменной?

Apollys supports Monica 25.09.2019 01:52

@Apollys Это может быть лучше подходит для ответа Датагика ниже. stackoverflow.com/a/3371180/3421

Jack M. 17.10.2019 18:57

Используйте строку формата - http://docs.python.org/lib/typesseq-strings.html

Например:

python -c 'print "%(num)02d" % {"num":5}'

В Python 2.6+ и 3.0+ вы должны использовать строковый метод format():

for i in (1, 10, 100):
    print('{num:02d}'.format(num=i))

или с помощью встроенного (для одного номера):

print(format(i, '02d'))

См. Документацию PEP-3101 для новых функций форматирования.

Также работает в Python 2.7.5. Вы также можете использовать '{: 02d}'. Format (1), если не хотите использовать именованные аргументы.

Jason Martens 07.01.2014 18:20

Прекрасно работает в 2.7.2 с плавающей точкой "{0: 04.0f}". Format (1.1) дает 0001 (: 04 = минимум 4 символа, в данном случае ведущие 0, .0f = плавающая точка без десятичных знаков) . Мне известно о форматировании%, но я хотел изменить существующий оператор .format, не переписывая все. Спасибо!

Michael Stimson 21.07.2015 04:31

Вы можете использовать str.zfill:

print(str(1).zfill(2))
print(str(10).zfill(2))
print(str(100).zfill(2))

печатает:

01
10
100

Мне нравится это решение, так как оно помогает не только при выводе числа, но и когда вам нужно присвоить его переменной ... например. x = str (datetime.date.today (). month) .zfill (2) вернет x как '02' для месяца feb.

EroSan 24.02.2011 20:33

Это должен быть правильный ответ, поскольку "{1:02d}" не может иметь переменные вместо 2 (например, если вы создаете динамическую функцию).

Joshua 20.05.2020 13:37

@JoshuaVarghese Может иметь переменные: "{0:0{1}}". Передайте любое количество нулей в качестве второго аргумента.

Jim 20.08.2020 01:46

Или это:

print '{0:02d}'.format(1)

Пифонический способ сделать это:

str(number).rjust(string_width, fill_char)

Таким образом, исходная строка возвращается без изменений, если ее длина больше, чем string_width. Пример:

a = [1, 10, 100]
for num in a:
    print str(num).rjust(2, '0')

Полученные результаты:

01
10
100

print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

печатает:

01
10
100

Таким образом, вы можете несколько раз повторить аргумент внутри строки: One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)

srodriguex 15.04.2014 01:00

Совместим только с Python 3. Если вы используете Python 2.7, сделайте print '{:02}'.format(1)

Blairg23 01.02.2017 02:30

width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted

Или другое решение.

"{:0>2}".format(number)

Это был бы способ Python, хотя я бы для ясности включил параметр - "{0:0>2}".format(number), если кто-то захочет nLeadingZeros, они должны отметить, что они также могут: "{0:0>{1}}".format(number, nLeadingZeros + 1)

Jonathan Allan 24.04.2016 21:33

Если вы имеете дело с числами, состоящими из одной или двух цифр:

'0'+str(number)[-2:] или '0{0}'.format(number)[-2:]

В Python> = 3.6 вы можете сделать это кратко с новыми f-строками, которые были введены с помощью:

f'{val:02}'

который печатает переменную с именем val со значением fill0 и width2.

Для вашего конкретного примера вы можете сделать это красиво в цикле:

a, b, c = 1, 10, 100
for val in [a, b, c]:
    print(f'{val:02}')

который печатает:

01 
10
100

Для получения дополнительной информации о f-струнах взгляните на PEP 498, где они были представлены.

Использовать:

'00'[len(str(i)):] + str(i)

Или с модулем math:

import math
'00'[math.ceil(math.log(i, 10)):] + str(i)

Вот как я это делаю:

str(1).zfill(len(str(total)))

Обычно zfill принимает количество начальных нулей, которые вы хотите добавить, поэтому легко взять самое большое число, превратить его в строку и получить длину, например:

Python 3.6.5 (default, May 11 2018, 04:00:52) 
[GCC 8.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> total = 100
>>> print(str(1).zfill(len(str(total))))
001
>>> total = 1000
>>> print(str(1).zfill(len(str(total))))
0001
>>> total = 10000
>>> print(str(1).zfill(len(str(total))))
00001
>>> 

Разве это не противоречит Ответ Датагика?

Peter Mortensen 22.06.2018 23:57

df['Col1']=df['Col1'].apply(lambda x: '{0:0>5}'.format(x))

5 - это общее количество цифр.

Я использовал эту ссылку: http://www.datasciencemadesimple.com/add-leading-preceding-zeros-python/

Вы можете сделать это с помощью f струны.

import numpy as np

print(f'{np.random.choice([1, 124, 13566]):0>8}')

Это напечатает постоянную длину 8, а оставшуюся часть дополнит ведущим 0.

00000001
00000124
00013566

Все это создает строку «01»:

>python -m timeit "'{:02d}'.format(1)"
1000000 loops, best of 5: 357 nsec per loop

>python -m timeit "'{0:0{1}d}'.format(1,2)"
500000 loops, best of 5: 607 nsec per loop

>python -m timeit "f'{1:02d}'"
1000000 loops, best of 5: 281 nsec per loop

>python -m timeit "f'{1:0{2}d}'"
500000 loops, best of 5: 423 nsec per loop

>python -m timeit "str(1).zfill(2)"
1000000 loops, best of 5: 271 nsec per loop

>python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32

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