Jaki jest Pythoński sposób wypełniania łańcucha numerycznego zerami po lewej stronie, tj. Aby łańcuch liczbowy miał określoną długość?
python
string
zero-padding
Nicolas Gervais
źródło
źródło
python >= 2.6
są niepoprawne. Ta składnia nie działapython >= 3
. Możesz to zmienićpython < 3
, ale czy mogę zasugerować, aby zawsze używać nawiasów i całkowicie pomijać komentarze (zachęcając do zalecanego używania)?'{:03d} {:03d}'.format(1, 2)
domyślnie przypisuje wartości w kolejności.print
stwierdzenie, kiedy powinna to byćprint
funkcja w Pythonie 3? Redagowałem w parens; ponieważ drukowana jest tylko jedna rzecz, działa teraz identycznie na Py2 i Py3.Wystarczy użyć metody rjust obiektu string.
Ten przykład utworzy łańcuch o długości 10 znaków, w razie potrzeby dopełniający.
źródło
Poza tym
zfill
możesz użyć ogólnego formatowania ciągów:Dokumentacja dotycząca formatowania i f-stringów .
źródło
format
zamiast tego, a ludzie ogólnie interpretują to jako zamiar zaniechania.W przypadku języka Python 3.6+ używającego ciągów F:
W przypadku Python 2 do Python 3.5:
źródło
jeśli chcesz czegoś przeciwnego:
źródło
str(n).zfill(width)
będzie działać zstring
s,int
s,float
s ... i jest kompatybilny z Python 2. xi 3. x :źródło
Dla tych, którzy przybyli tutaj, aby zrozumieć, a nie tylko szybką odpowiedź. Robię to szczególnie dla ciągów czasowych:
źródło
str.zfill
jest specjalnie przeznaczony do tego:Zauważ, że jest specjalnie przeznaczony do obsługi ciągów liczbowych zgodnie z żądaniem i przesuwa a
+
lub-
na początek ciągu:Oto pomoc dotycząca
str.zfill
:Wydajność
Jest to również najbardziej wydajna metoda alternatywna:
Aby najlepiej porównać jabłka z jabłkami dla tej
%
metody (zwróć uwagę, że jest ona wolniejsza), która w przeciwnym razie wstępnie obliczy:Realizacja
Przy odrobinie kopania znalazłem implementację
zfill
metody wObjects/stringlib/transmogrify.h
:Przejdźmy przez ten kod C.
Najpierw analizuje argument w pozycji, co oznacza, że nie dopuszcza argumentów słów kluczowych:
Następnie sprawdza, czy ma taką samą długość lub dłużej, w którym to przypadku zwraca ciąg.
zfill
Połączeniapad
(tapad
funkcja nazywa się takżeljust
,rjust
icenter
jak dobrze). To w zasadzie kopiuje zawartość do nowego ciągu i wypełnia wypełnienie.Po wywołaniu
pad
,zfill
porusza każdy pierwotnie poprzedzający+
lub-
na początku łańcucha.Pamiętaj, że oryginalny ciąg znaków, który ma być numeryczny, nie jest wymagany:
źródło
+
i-
, i dodałem link do docs!Zobacz ekscytujące szczegóły w dokumentacji drukowanej!
Aktualizacja dla Python 3.x (7,5 roku później)
Ostatnia linia powinna być teraz:
Tj.
print()
Jest teraz funkcją, a nie instrukcją. Zauważ, że nadal wolęprintf()
styl Old School , ponieważ, IMNSHO, czyta lepiej, i ponieważ, um, używam tego zapisu od stycznia 1980 roku. Coś… stare psy… coś… nowe sztuczki.źródło
"%0*d" % (width, x)
interpretuje go Python?W przypadku Pythona
>= 3.6
najczystszym sposobem jest użycie ciągów F z formatowaniem ciągów :Wolałbym formatować za pomocą
int
, ponieważ tylko wtedy znak jest obsługiwany poprawnie:źródło
W przypadku kodów pocztowych zapisanych jako liczby całkowite:
źródło
Szybkie porównanie czasów:
Przeprowadziłem różne testy różnych powtórzeń. Różnice nie są ogromne, ale we wszystkich testach
zfill
rozwiązanie było najszybsze.źródło
Innym podejściem byłoby użycie zrozumienia listy z warunkiem sprawdzania długości. Poniżej znajduje się demonstracja:
źródło
Jest też w porządku:
więc wynikiem będzie: „02:07:03”
źródło
Możesz także powtórzyć „0”, wstawić go do
str(n)
poprzedniej pozycji i uzyskać plasterek o skrajnej prawej szerokości. Szybki i brudny mały wyraz.źródło