使用零填充数字字符串的最Pythonic方法是什么,即数字字符串是否具有特定长度?
字符串:
>>> 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
字符串格式文档.
只需使用字符串对象的rjust方法.
此示例将生成一个长度为10个字符的字符串,根据需要填充.
>>> t = 'test' >>> t.rjust(10, '0') >>> '000000test'
对于数字:
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'))
另请参见:Python:字符串格式.
编辑:这是值得注意的是,截至昨日 2008年12月3日,格式化的这种方法有利于被弃用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'))
有关详细信息,请参阅PEP 3101.
适用于Python 2和Python 3:
>>> "{:0>2}".format("1") # Works for both numbers and strings. '01' >>> "{:02}".format(1) # Works only for numbers. '01'
>>> '99'.zfill(5) '00099' >>> '99'.rjust(5,'0') '00099'
如果你想要相反:
>>> '99'.ljust(5,'0') '99000'
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'
对于那些来这里了解而不仅仅是快速回答的人.我特别为时间字符串做这些:
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
使用零填充数字字符串的最pythonic方法是什么,即数字字符串是否具有特定长度?
str.zfill
特别打算这样做:
>>> '1'.zfill(4) '0001'
请注意,它专门用于处理请求的数字字符串,并将a +
或移动-
到字符串的开头:
>>> '+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
通过一点挖掘,我发现了该zfill
方法的实现Objects/stringlib/transmogrify.h
:
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 "", line 1, in 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'
width = 10 x = 5 print "%0*d" % (width, x) > 0000000005
有关所有令人兴奋的细节,请参阅打印文档!
Python 3.x更新(7.5年后)
最后一行现在应该是:
print("%0*d" % (width, x))
即print()
现在是一个功能,而不是一个声明.请注意,我仍然更喜欢老派printf()
风格,因为,IMNSHO,它读起来更好,因为,嗯,我从1980年1月开始使用那种符号.某些东西......老狗......什么东西......新技巧.