Hoe PAD NOSERS naar een string?

Wat is een pythonische manier om een ​​numerieke reeks met nullen naar links te plegen, d.w.z. dat de numerieke string een specifieke lengte heeft?


1, Autoriteit 100%

Strings:

>>> n = '4'
>>> print(n.zfill(3))
004

en voor nummers:

>>> n = 4
>>> print(f'{n:03}') # Preferred method, python >= 3.6
004
>>> print('%03d' % n)
004
>>> print(format(n, '03')) # python >= 2.6
004
>>> print('{0:03d}'.format(n))  # python >= 2.6 + python 3
004
>>> print('{foo:03d}'.format(foo=n))  # python >= 2.6 + python 3
004
>>> print('{:03d}'.format(n))  # python >= 2.7 + python3
004

string-formattering documentatie .


2, Autoriteit 14%

Gebruik gewoon de rjust methode van het string-object.

Dit voorbeeld maakt een reeks van 10 tekens lang, vulling indien nodig.

>>> t = 'test'
>>> t.rjust(10, '0')
>>> '000000test'

3, Autoriteit 6%

Naast zfillkunt u algemene reeksopmaak gebruiken:

print(f'{number:05d}') # (since Python 3.6), or
print('{:05d}'.format(number)) # or
print('{0:05d}'.format(number)) # or (explicit 0th positional arg. selection)
print('{n:05d}'.format(n=number)) # or (explicit `n` keyword arg. selection)
print(format(number, '05d'))

Documentatie voor string-opmaaken f-strings.


Antwoord 4, autoriteit 4%

Voor Python 3.6+ met gebruik van f-strings:

>>> i = 1
>>> f"{i:0>2}"  # Works for both numbers and strings.
'01'
>>> f"{i:02}"  # Works only for numbers.
'01'

Voor Python 2 tot Python 3.5:

>>> "{:0>2}".format("1")  # Works for both numbers and strings.
'01'
>>> "{:02}".format(1)  # Works only for numbers.
'01'

Antwoord 5, autoriteit 2%

>>> '99'.zfill(5)
'00099'
>>> '99'.rjust(5,'0')
'00099'

als je het tegenovergestelde wilt:

>>> '99'.ljust(5,'0')
'99000'

Antwoord 6

str(n).zfill(width)werkt met strings, ints, floats… en is Python 2.xen 3.xcompatibel:

>>> n = 3
>>> str(n).zfill(5)
'00003'
>>> n = '3'
>>> str(n).zfill(5)
'00003'
>>> n = '3.0'
>>> str(n).zfill(5)
'003.0'

Antwoord 7

Voor degenen die hier kwamen om het te begrijpen en niet alleen voor een snel antwoord.
Ik doe deze speciaal voor tijdreeksen:

hour = 4
minute = 3
"{:0>2}:{:0>2}".format(hour,minute)
# prints 04:03
"{:0>3}:{:0>5}".format(hour,minute)
# prints '004:00003'
"{:0<3}:{:0<5}".format(hour,minute)
# prints '400:30000'
"{:$<3}:{:#<5}".format(hour,minute)
# prints '4$$:3####'

“0” symbolen wat te vervangen door de “2” opvultekens, de standaard is een lege ruimte

“>” symbolen lijnen alle 2 “0”-tekens links van de tekenreeks uit

“:” symboliseert de format_spec


Antwoord 8

Als je Python >= 3.6gebruikt, is de schoonste manier om f-stringsmet tekenreeksopmaak:

>>> s = f"{1:08}"  # inline with int
>>> s
'00000001'
>>> s = f"{'1':0>8}"  # inline with str
>>> s
'00000001'
>>> n = 1
>>> s = f"{n:08}"  # int variable
>>> s
'00000001'
>>> c = "1"
>>> s = f"{c:0>8}"  # str variable
>>> s
'00000001'

Ik geef de voorkeur aan opmaak met een int, omdat alleen dan het teken correct wordt afgehandeld:

>>> f"{ -1:08}"
'-0000001'
>>> f"{1:+08}"
'+0000001'
>>> f"{'-1':0>8}"
'000000-1'

Antwoord 9

width = 10
x = 5
print "%0*d" % (width, x)
> 0000000005

Bekijk de gedrukte documentatie voor alle spannende details!

Update voor Python 3.x (7,5 jaar later)

Die laatste regel zou nu moeten zijn:

print("%0*d" % (width, x))

d.w.z. print()is nu een functie, geen verklaring. Merk op dat ik nog steeds de voorkeur geeft aan de oude school printf()stijl omdat IMNSHO, beter leest, en omdat ik die notatie sinds januari, 1980 heb gebruikt. Iets … Oude honden .. iets iets … nieuwe trucs.


10

Ik voeg eraan hoe u een int van een lengte van een tekenreeks in een F-string gebruikt omdat het niet gedekt lijkt te zijn:

>>> pad_number = len("this_string")
11
>>> s = f"{1:0{pad_number}}" }
>>> s
'00000000001'

11

Voor postcodes die zijn opgeslagen als gehele getallen:

>>> a = 6340
>>> b = 90210
>>> print '%05d' % a
06340
>>> print '%05d' % b
90210

12

Snelle timingvergelijking:

setup = '''
from random import randint
def test_1():
    num = randint(0,1000000)
    return str(num).zfill(7)
def test_2():
    num = randint(0,1000000)
    return format(num, '07')
def test_3():
    num = randint(0,1000000)
    return '{0:07d}'.format(num)
def test_4():
    num = randint(0,1000000)
    return format(num, '07d')
def test_5():
    num = randint(0,1000000)
    return '{:07d}'.format(num)
def test_6():
    num = randint(0,1000000)
    return '{x:07d}'.format(x=num)
def test_7():
    num = randint(0,1000000)
    return str(num).rjust(7, '0')
'''
import timeit
print timeit.Timer("test_1()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_2()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_3()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_4()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_5()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_6()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_7()", setup=setup).repeat(3, 900000)
> [2.281613943830961, 2.2719342631547077, 2.261691106209631]
> [2.311480238815406, 2.318420542148333, 2.3552384305184493]
> [2.3824197456864304, 2.3457239951596485, 2.3353268829498646]
> [2.312442972404032, 2.318053102249902, 2.3054072168069872]
> [2.3482314132374853, 2.3403386400002475, 2.330108825844775]
> [2.424549090688892, 2.4346475296851438, 2.429691196530058]
> [2.3259756401716487, 2.333549212826732, 2.32049893822186]

Ik heb verschillende tests gedaan met verschillende herhalingen. De verschillen zijn niet enorm, maar in alle tests was de zfill-oplossing het snelst.


Antwoord 13

Een andere benadering zou zijn om een lijstbegrip te gebruiken met een conditiecontrole op lengtes. Hieronder is een demonstratie:

# input list of strings that we want to prepend zeros
In [71]: list_of_str = ["101010", "10101010", "11110", "0000"]
# prepend zeros to make each string to length 8, if length of string is less than 8
In [83]: ["0"*(8-len(s)) + s if len(s) < desired_len else s for s in list_of_str]
Out[83]: ['00101010', '10101010', '00011110', '00000000']

Antwoord 14

Het is ook goed:

h = 2
 m = 7
 s = 3
 print("%02d:%02d:%02d" % (h, m, s))

dus output zal zijn: “02:07:03”


Antwoord 15

Ik heb een functie gemaakt :

def PadNumber(number, n_pad, add_prefix=None):
    number_str = str(number)
    paded_number = number_str.zfill(n_pad)
    if add_prefix:
        paded_number = add_prefix+paded_number
    print(paded_number)
PadNumber(99, 4)
PadNumber(1011, 8, "b'")
PadNumber('7BEF', 6, "#")

De uitvoer:

0099
b'00001011
#007BEF

Antwoord 16

Je kunt ook “0” herhalen, het toevoegen aan str(n)en de meest rechtse breedteschijf krijgen. Snelle en vuile kleine uitdrukking.

def pad_left(n, width, pad="0"):
    return ((pad * width) + str(n))[-width:]

Other episodes