Hướng dẫn how do you zero a padding in python? - làm thế nào để bạn không có phần đệm trong python?

Cách pythonic nhất để đệm một chuỗi số với số 0 ở bên trái, tức là, vì vậy chuỗi số có độ dài cụ thể?

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
3 đặc biệt nhằm mục đích làm điều này:

>>> '1'.zfill(4)
'0001'

Lưu ý rằng nó được dự định cụ thể để xử lý các chuỗi số theo yêu cầu và di chuyển một

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
4 hoặc
>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
5 sang đầu chuỗi:

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'

Đây là sự giúp đỡ trên

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
3:

>>> 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.

Màn biểu diễn

Đây cũng là hiệu suất nhất của các phương pháp thay thế:

>>> 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

Để so sánh tốt nhất táo với táo cho phương pháp

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
7 (lưu ý nó thực sự chậm hơn), nếu không sẽ tính trước:

>>> min(timeit.repeat(lambda: '1'.zfill(0 or 4)))
0.19728074967861176
>>> min(timeit.repeat(lambda: '%04d' % (0 or 1)))
0.2347015216946602

Thực hiện

Với một chút đào, tôi đã tìm thấy việc triển khai phương thức

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
8 trong
>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
9:

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;
}

Hãy đi qua mã C này.

Trước tiên, nó phân tích đối số ở vị trí, có nghĩa là nó không cho phép các đối số từ khóa:

>>> '1'.zfill(width=4)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: zfill() takes no keyword arguments

Sau đó, nó kiểm tra xem nó có cùng độ dài hoặc dài hơn không, trong trường hợp đó nó trả về chuỗi.

>>> '1'.zfill(0)
'1'

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
8 gọi
>>> 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.
1 (hàm
>>> 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.
1 này cũng được gọi bởi
>>> 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.
3,
>>> 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.
4 và
>>> 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.
5 cũng vậy). Điều này về cơ bản sao chép nội dung vào một chuỗi mới và điền vào phần đệm.

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;
}

Sau khi gọi

>>> 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.
1,
>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
8 di chuyển bất kỳ trước đó trước
>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
4 hoặc
>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
5 đến đầu chuỗi.

Lưu ý rằng để chuỗi ban đầu thực sự là không cần số:

>>> '+foo'.zfill(10)
'+000000foo'
>>> '-foo'.zfill(10)
'-000000foo'

Bài viết này cho thấy cách đệm một chuỗi số với số 0 ở bên trái sao cho chuỗi có độ dài cụ thể.

Nó cũng cho thấy cách các con số có thể được chuyển đổi thành một chuỗi được định dạng với số không dẫn đầu.

Sử dụng >>> 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 0

Zfill là phương pháp tốt nhất để pad zeros từ phía bên trái vì nó cũng có thể xử lý dấu hiệu '+' hoặc '-' hàng đầu.

Nó trả về một bản sao của chuỗi bên trái chứa đầy các chữ số '0' để tạo một chuỗi chiều rộng. Một tiền tố dấu hiệu hàng đầu ('+'/'-') được xử lý bằng cách chèn phần đệm sau ký tự dấu hiệu chứ không phải trước. Chuỗi ban đầu được trả về nếu chiều rộng nhỏ hơn hoặc bằng Len (s).

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
0

Sử dụng >>> 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 1

Nếu bạn muốn chèn một ký tự tùy ý ở phía bên trái, hãy sử dụng rjust. Nó trả về một bản sao của đối tượng đúng được chứng minh theo một chuỗi chiều rộng. Nhân vật điền mặc định là một không gian. Tuy nhiên, điều này không xử lý một tiền tố dấu hiệu.

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
1

Các số có thể được đệm với định dạng chuỗi

Đã chuyển đổi một số thành một chuỗi được định dạng với các số không dẫn đầu bằng cách sử dụng định dạng chuỗi:

>>> '+1'.zfill(4)
'+001'
>>> '-1'.zfill(4)
'-001'
2

Xem thêm trong tài liệu định dạng chuỗi