숫자 문자열을 왼쪽에 0으로 채우는 Pythonic 방법은 무엇입니까, 즉 숫자 문자열이 특정 길이를 갖도록 합니까?
질문자 :Faisal
문자열:
>>> n = '4' >>> print(n.zfill(3)) 004
그리고 숫자의 경우:
>>> 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
Harley Holcombe
string 객체 의 rjust 메소드를 사용하면 됩니다.
이 예제는 10자 길이의 문자열을 만들고 필요에 따라 패딩합니다.
>>> t = 'test' >>> t.rjust(10, '0') >>> '000000test'
Paul D. Eden
zfill
외에도 일반 문자열 형식을 사용할 수 있습니다.
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'))
Konrad Rudolph
f-문자열을 사용하는 Python 3.6 이상의 경우:
>>> i = 1 >>> f"{i:0>2}" # Works for both numbers and strings. '01' >>> f"{i:02}" # Works only for numbers. '01'
Python 2~Python 3.5의 경우:
>>> "{:0>2}".format("1") # Works for both numbers and strings. '01' >>> "{:02}".format(1) # Works only for numbers. '01'
Cees Timmerman
>>> '99'.zfill(5) '00099' >>> '99'.rjust(5,'0') '00099'
반대를 원한다면:
>>> '99'.ljust(5,'0') '99000'
Victor Barrantes
str(n).zfill(width)
string
s, int
s, float
s...와 함께 작동하며 Python 2. x 및 3. x 호환 가능:
>>> n = 3 >>> str(n).zfill(5) '00003' >>> n = '3' >>> str(n).zfill(5) '00003' >>> n = '3.0' >>> str(n).zfill(5) '003.0'
Johnsyweb
숫자 문자열을 왼쪽에 0으로 채우는 가장 파이썬적인 방법은 무엇입니까? 즉, 숫자 문자열이 특정 길이를 갖도록 합니까?
str.zfill
은 특별히 다음을 수행하기 위한 것입니다.
>>> '1'.zfill(4) '0001'
이것은 특별히 요청된 대로 숫자 문자열을 처리하기 위한 것이며 +
또는 -
를 문자열의 시작 부분으로 이동합니다.
>>> '+1'.zfill(4) '+001' >>> '-1'.zfill(4) '-001'
str.zfill
대한 도움말입니다.
>>> help(str.zfill) Help on method_descriptor: zfill(...) S.zfill(width) -> str Pad a numeric string S with zeros on the left, to fill a field of the specified width. The string S is never truncated.
성능
이것은 또한 대체 방법 중 가장 성능이 좋습니다.
>>> min(timeit.repeat(lambda: '1'.zfill(4))) 0.18824880896136165 >>> min(timeit.repeat(lambda: '1'.rjust(4, '0'))) 0.2104538488201797 >>> min(timeit.repeat(lambda: f'{1:04}')) 0.32585487607866526 >>> min(timeit.repeat(lambda: '{:04}'.format(1))) 0.34988890308886766
%
방법에 대해 사과와 사과를 가장 잘 비교하려면(실제로 더 느립니다) 그렇지 않으면 사전 계산됩니다:
>>> min(timeit.repeat(lambda: '1'.zfill(0 or 4))) 0.19728074967861176 >>> min(timeit.repeat(lambda: '%04d' % (0 or 1))) 0.2347015216946602
구현
약간의 파고를 통해 Objects/stringlib/transmogrify.h
zfill
/transmogrify.h 에서 zfill 메서드 구현을 찾았습니다.
static PyObject * stringlib_zfill(PyObject *self, PyObject *args) { Py_ssize_t fill; PyObject *s; char *p; Py_ssize_t width; if (!PyArg_ParseTuple(args, "n:zfill", &width)) return NULL; if (STRINGLIB_LEN(self) >= width) { return return_self(self); } fill = width - STRINGLIB_LEN(self); s = pad(self, fill, 0, '0'); if (s == NULL) return NULL; p = STRINGLIB_STR(s); if (p[fill] == '+' || p[fill] == '-') { /* move sign to beginning of string */ p[0] = p[fill]; p[fill] = '0'; } return s; }
이 C 코드를 살펴보겠습니다.
먼저 인수를 위치적으로 구문 분석합니다. 즉, 키워드 인수를 허용하지 않습니다.
>>> '1'.zfill(width=4) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: zfill() takes no keyword arguments
그런 다음 길이가 같거나 더 긴지 확인하고 이 경우 문자열을 반환합니다.
>>> '1'.zfill(0) '1'
zfill
은 pad
호출합니다(이 pad
ljust
, rjust
및 center
에서도 호출됩니다). 이것은 기본적으로 내용을 새 문자열로 복사하고 패딩을 채웁니다.
static inline PyObject * pad(PyObject *self, Py_ssize_t left, Py_ssize_t right, char fill) { PyObject *u; if (left < 0) left = 0; if (right < 0) right = 0; if (left == 0 && right == 0) { return return_self(self); } u = STRINGLIB_NEW(NULL, left + STRINGLIB_LEN(self) + right); if (u) { if (left) memset(STRINGLIB_STR(u), fill, left); memcpy(STRINGLIB_STR(u) + left, STRINGLIB_STR(self), STRINGLIB_LEN(self)); if (right) memset(STRINGLIB_STR(u) + left + STRINGLIB_LEN(self), fill, right); } return u; }
pad
호출한 후 zfill
은 원래 이전의 +
또는 -
를 문자열의 시작 부분으로 이동합니다.
원래 문자열이 실제로 숫자일 필요는 없습니다.
>>> '+foo'.zfill(10) '+000000foo' >>> '-foo'.zfill(10) '-000000foo'
Aaron Hall
빠른 답변이 아닌 이해를 위해 찾아오신 분들을 위해. 특히 시간 문자열에 대해 다음을 수행합니다.
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" 기호는 "2" 패딩 문자로 대체할 것이며 기본값은 빈 공간입니다.
">" 기호는 2개의 "0" 문자를 모두 문자열 왼쪽에 정렬합니다.
":"는 format_spec을 나타냅니다.
elad silver
Python >= 3.6
을 사용할 때 가장 깔끔한 방법은 문자열 형식으로 f-문자열 을 사용하는 것입니다.
>>> 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'
int
형식을 지정하는 것을 선호합니다. 그래야만 기호가 올바르게 처리되기 때문입니다.
>>> f"{-1:08}" '-0000001' >>> f"{1:+08}" '+0000001' >>> f"{'-1':0>8}" '000000-1'
ruohola
width = 10 x = 5 print "%0*d" % (width, x) > 0000000005
모든 흥미로운 세부 사항은 인쇄 설명서를 참조하십시오!
Python 3.x용 업데이트(7.5년 후)
이제 마지막 줄은 다음과 같아야 합니다.
print("%0*d" % (width, x))
즉, print()
는 이제 문이 아니라 함수입니다. 내가 여전히 Old School printf()
스타일을 선호하는 이유는 IMNSHO가 더 읽기 좋고 음, 1980년 1월부터 그 표기법을 사용했기 때문입니다. 뭔가 ... 늙은 개 .. 뭔가 ... 새로운 트릭.
Peter Rowell
f-string 내의 문자열 길이에서 int를 사용하는 방법을 추가하고 있습니다.
>>> pad_number = len("this_string") 11 >>> s = f"{1:0{pad_number}}" } >>> s '00000000001'
NBStephens
정수로 저장된 우편번호의 경우:
>>> a = 6340 >>> b = 90210 >>> print '%05d' % a 06340 >>> print '%05d' % b 90210
user221014
빠른 타이밍 비교:
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]
나는 다른 반복의 다른 테스트를 했다. 차이는 크지 않지만 모든 테스트에서 zfill
솔루션이 가장 빨랐습니다.
Simon Steinberger
또 다른 접근 방식은 길이를 확인하는 조건과 함께 목록 이해를 사용하는 것입니다. 아래는 데모입니다.
# 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']
kmario23
괜찮습니다.
h = 2 m = 7 s = 3 print("%02d:%02d:%02d" % (h, m, s))
따라서 출력은 "02:07:03"이 됩니다.
zzfima
나는 기능을 만들었습니다 :
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, "#")
출력:
0099 b'00001011 #007BEF
Julien Faujanet
"0"을 반복하고 str(n)
앞에 추가하고 가장 오른쪽 너비 슬라이스를 얻을 수도 있습니다. 빠르고 더러운 작은 표현.
def pad_left(n, width, pad="0"): return ((pad * width) + str(n))[-width:]
J Lacar
숫자의 경우:
i = 2 print(f"{i:05d}")
산출
00005
user1315621
출처 : http:www.stackoverflow.com/questions/339007/how-to-pad-zeroes-to-a-string
'etc. > StackOverFlow' 카테고리의 다른 글
JavaScript에서 JSON을 구문 분석하시겠습니까? [복제하다] (0) | 2022.01.04 |
---|---|
내 모든 Git 은닉물을 한 번에 삭제하려면 어떻게 해야 합니까? (0) | 2022.01.04 |
JSP 2를 사용하여 JSP 파일에서 Java 코드를 피하려면 어떻게 해야 합니까? (0) | 2022.01.04 |
Pandas DataFrame에서 열 삭제 (0) | 2022.01.04 |
임의의 문자열을 사용하는 이 코드가 "hello world"를 인쇄하는 이유는 무엇입니까? (0) | 2022.01.04 |