Python lặp qua các cặp liên tiếp

Mô-đun chuẩn hóa một tập hợp cốt lõi gồm các công cụ nhanh, hiệu quả về bộ nhớ, hữu ích khi sử dụng riêng lẻ hoặc kết hợp. Cùng với nhau, chúng tạo thành một “đại số lặp” để có thể xây dựng các công cụ chuyên dụng một cách ngắn gọn và hiệu quả bằng Python thuần túy

Chẳng hạn, SML cung cấp một công cụ lập bảng.

def chain[*iterables]:
    # chain['ABC', 'DEF'] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
9 tạo ra chuỗi
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
0. Hiệu ứng tương tự có thể đạt được trong Python bằng cách kết hợp
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1 và
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
2 để tạo thành
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
3

Các công cụ này và các đối tác tích hợp của chúng cũng hoạt động tốt với các chức năng tốc độ cao trong mô-đun

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
4. Ví dụ, toán tử nhân có thể được ánh xạ qua hai vectơ để tạo thành tích vô hướng hiệu quả.
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
5

Trình vòng lặp vô hạn

Trình lặp

Tranh luận

Kết quả

Thí dụ

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
2

bắt đầu, [bước]

bắt đầu, bắt đầu+bước, bắt đầu+2*bước, …

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
7

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
8

p

p0, p1, … plast, p0, p1, …

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
9

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
10

phần tử [,n]

elem, elem, elem,… vô tận hoặc đến n lần

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
11

Trình lặp kết thúc trên chuỗi đầu vào ngắn nhất

Trình lặp

Tranh luận

Kết quả

Thí dụ

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
12

p [,func]

p0, p0+p1, p0+p1+p2, …

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
13

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14

p, q,…

p0, p1,… plast, q0, q1,…

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
15

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
16

lặp đi lặp lại

p0, p1,… plast, q0, q1,…

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
17

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
18

dữ liệu, bộ chọn

[d[0] nếu s[0]], [d[1] nếu s[1]], …

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
10

trước, tiếp theo

seq[n], seq[n+1], bắt đầu khi pred bị lỗi

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
11

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
12

trước, tiếp theo

các phần tử của seq trong đó pred[elem] là sai

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
13

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14

có thể lặp lại [, phím]

trình vòng lặp phụ được nhóm theo giá trị của khóa [v]

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
15

tiếp theo, [bắt đầu,] dừng [, bước]

các phần tử từ seq[start. dừng lại. bươc]

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
16

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
17

lặp đi lặp lại

[p[0], p[1]], [p[1], p[2]]

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
18

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19

chức năng, tiếp theo

func[*seq[0]], func[*seq[1]], …

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
10

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
11

trước, tiếp theo

seq[0], seq[1], cho đến khi pred thất bại

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
12

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
13

nó, n

it1, it2, … itn chia một iterator thành n

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14

p, q,…

[p[0], q[0]], [p[1], q[1]], …

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
15

vòng lặp tổ hợp

Trình lặp

Tranh luận

Kết quả

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
16

p, q, … [lặp lại=1]

sản phẩm cartesian, tương đương với vòng lặp for lồng nhau

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
17

p[, r]

bộ có độ dài r, tất cả các thứ tự có thể, không có phần tử lặp lại

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
18

tr, r

bộ có độ dài r, theo thứ tự được sắp xếp, không có phần tử lặp lại

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19

tr, r

bộ có độ dài r, theo thứ tự được sắp xếp, với các phần tử lặp lại

ví dụ

Kết quả

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
10

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
11

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
12

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
13

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
15

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
16

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
17

Hàm itertool¶

Các chức năng mô-đun sau đây tất cả các trình vòng lặp xây dựng và trả về. Một số cung cấp luồng có độ dài vô hạn, vì vậy chúng chỉ nên được truy cập bằng các hàm hoặc vòng lặp cắt bớt luồng

itertools. tích lũy[có thể lặp lại[ , func, *, initial=None]]

Tạo một trình lặp trả về tổng tích lũy hoặc kết quả tích lũy của các hàm nhị phân khác [được chỉ định thông qua đối số func tùy chọn]

Nếu func được cung cấp, nó phải là hàm của hai đối số. Các phần tử của đầu vào có thể lặp lại có thể là bất kỳ loại nào có thể được chấp nhận làm đối số cho func. [Ví dụ: với hoạt động mặc định của phép cộng, các phần tử có thể là bất kỳ loại có thể thêm nào bao gồm

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
18 hoặc
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19. ]

Thông thường, số lượng phần tử đầu ra khớp với đầu vào có thể lặp lại. Tuy nhiên, nếu đối số từ khóa ban đầu được cung cấp, thì quá trình tích lũy sẽ dẫn đến giá trị ban đầu để đầu ra có nhiều phần tử hơn đầu vào có thể lặp lại

Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1

Có một số cách sử dụng đối số func. Nó có thể được đặt thành

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
20 cho mức tối thiểu đang chạy,
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
21 cho mức tối đa đang chạy hoặc
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
22 cho sản phẩm đang chạy. Bảng khấu hao có thể được xây dựng bằng cách tích lũy tiền lãi và áp dụng các khoản thanh toán

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
5

Xem

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
23 để biết một hàm tương tự chỉ trả về giá trị tích lũy cuối cùng

Mới trong phiên bản 3. 2

Đã thay đổi trong phiên bản 3. 3. Đã thêm tham số func tùy chọn.

Đã thay đổi trong phiên bản 3. 8. Đã thêm tham số ban đầu tùy chọn.

itertools. chuỗi[*có thể lặp lại]

Tạo một trình lặp trả về các phần tử từ lần lặp đầu tiên cho đến khi hết, sau đó chuyển sang lần lặp tiếp theo, cho đến khi tất cả các lần lặp đã hết. Được sử dụng để coi các chuỗi liên tiếp là một chuỗi duy nhất. Gần tương đương với

def chain[*iterables]:
    # chain['ABC', 'DEF'] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

phương thức lớp chuỗi. from_iterable[có thể lặp lại]

Hàm tạo thay thế cho

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14. Nhận các đầu vào được xâu chuỗi từ một đối số có thể lặp lại duy nhất được đánh giá một cách lười biếng. Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

itertools. kết hợp[có thể lặp lại , r]

Trả về các chuỗi con độ dài r của các phần tử từ đầu vào có thể lặp lại

Các bộ dữ liệu kết hợp được phát ra theo thứ tự từ điển theo thứ tự của đầu vào có thể lặp lại. Vì vậy, nếu lần lặp đầu vào được sắp xếp, các bộ dữ liệu đầu ra sẽ được tạo theo thứ tự đã sắp xếp

Các yếu tố được coi là duy nhất dựa trên vị trí của chúng, không dựa trên giá trị của chúng. Vì vậy, nếu các phần tử đầu vào là duy nhất, sẽ không có giá trị lặp lại trong mỗi kết hợp

Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1

Mã cho

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
18 cũng có thể được biểu thị dưới dạng chuỗi con của
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
17 sau khi lọc các mục trong đó các phần tử không được sắp xếp theo thứ tự [theo vị trí của chúng trong nhóm đầu vào]

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1

Số lượng mặt hàng được trả lại là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
27 khi
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
28 hoặc bằng 0 khi
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
29

itertools. combinations_with_replacement[có thể lặp lại , r]

Trả về các chuỗi con có độ dài r của các phần tử từ đầu vào có thể lặp lại cho phép các phần tử riêng lẻ được lặp lại nhiều lần

Các bộ dữ liệu kết hợp được phát ra theo thứ tự từ điển theo thứ tự của đầu vào có thể lặp lại. Vì vậy, nếu lần lặp đầu vào được sắp xếp, các bộ dữ liệu đầu ra sẽ được tạo theo thứ tự đã sắp xếp

Các yếu tố được coi là duy nhất dựa trên vị trí của chúng, không dựa trên giá trị của chúng. Vì vậy, nếu các phần tử đầu vào là duy nhất, thì các kết hợp được tạo cũng sẽ là duy nhất

Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1

Mã cho

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19 cũng có thể được biểu thị dưới dạng chuỗi con của
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
16 sau khi lọc các mục trong đó các phần tử không được sắp xếp theo thứ tự [theo vị trí của chúng trong nhóm đầu vào]

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1

Số lượng mặt hàng được trả lại là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
12 khi
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
13

Mới trong phiên bản 3. 1

itertools. nén[dữ liệu , bộ chọn]

Tạo một trình vòng lặp lọc các phần tử từ dữ liệu chỉ trả về những phần tử có phần tử tương ứng trong bộ chọn có giá trị là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14. Dừng khi hết dữ liệu hoặc bộ chọn lặp lại. Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
2

Mới trong phiên bản 3. 1

itertools. đếm[bắt đầu=0, step=1]

Tạo một trình vòng lặp trả về các giá trị cách đều nhau bắt đầu bằng số bắt đầu. Thường được sử dụng làm đối số cho

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1 để tạo các điểm dữ liệu liên tiếp. Ngoài ra, được sử dụng với
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
16 để thêm số thứ tự. Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1

Khi đếm với các số dấu phẩy động, đôi khi có thể đạt được độ chính xác cao hơn bằng cách thay thế mã nhân như.

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
17

Đã thay đổi trong phiên bản 3. 1. Đã thêm đối số bước và cho phép đối số không phải là số nguyên.

itertools. chu kỳ[có thể lặp lại]

Tạo một iterator trả về các phần tử từ iterable và lưu một bản sao của từng phần tử. Khi iterable cạn kiệt, hãy trả lại các phần tử từ bản sao đã lưu. Lặp lại vô thời hạn. Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
50

Lưu ý, thành viên này của bộ công cụ có thể yêu cầu bộ nhớ phụ đáng kể [tùy thuộc vào độ dài của lần lặp]

itertools. dropwhile[vị ngữ , có thể lặp lại]

Tạo một trình vòng lặp loại bỏ các phần tử khỏi vòng lặp miễn là vị từ là đúng; . Lưu ý, trình vòng lặp không tạo ra bất kỳ đầu ra nào cho đến khi vị từ đầu tiên trở thành sai, do đó, nó có thể có thời gian khởi động lâu. Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
51

itertools. filterfalse[vị ngữ , có thể lặp lại]

Tạo một iterator lọc các phần tử từ iterable chỉ trả về những phần tử có vị từ là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
18. Nếu vị ngữ là
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19, hãy trả lại các mục sai. Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
52

itertools. nhóm theo[có thể lặp lại , phím=None]

Tạo một trình vòng lặp trả về các khóa và nhóm liên tiếp từ vòng lặp. Khóa là một hàm tính toán giá trị khóa cho từng phần tử. Nếu không được chỉ định hoặc là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19, khóa sẽ mặc định là hàm nhận dạng và trả về phần tử không thay đổi. Nói chung, iterable cần phải được sắp xếp trên cùng một chức năng chính

Hoạt động của

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14 tương tự như bộ lọc
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
502 trong Unix. Nó tạo ra một ngắt hoặc nhóm mới mỗi khi giá trị của hàm chính thay đổi [đó là lý do tại sao thường cần phải sắp xếp dữ liệu bằng cùng một hàm chính]. Hành vi đó khác với GROUP BY của SQL tổng hợp các phần tử phổ biến bất kể thứ tự đầu vào của chúng

Bản thân nhóm được trả về là một iterator chia sẻ iterable cơ bản với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14. Vì nguồn được chia sẻ nên khi đối tượng
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14 được nâng cao, nhóm trước đó sẽ không còn hiển thị nữa. Vì vậy, nếu dữ liệu đó cần thiết sau này, nó sẽ được lưu trữ dưới dạng danh sách

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
53

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14 gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
54

itertools. islice[có thể lặp lại , dừng . ]itertools.islice[có thể lặp lại , bắt đầu, stop[, step]]

Tạo một trình lặp trả về các phần tử đã chọn từ có thể lặp lại. Nếu start khác 0, thì các phần tử từ iterable sẽ bị bỏ qua cho đến khi bắt đầu. Sau đó, các phần tử được trả về liên tiếp trừ khi bước được đặt cao hơn bước dẫn đến các mục bị bỏ qua. Nếu điểm dừng là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19, thì quá trình lặp tiếp tục cho đến khi hết trình lặp, nếu có;

Nếu bắt đầu là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19, thì quá trình lặp lại bắt đầu từ 0. Nếu bước là
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19, thì bước này mặc định là một

Không giống như cắt thông thường,

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
15 không hỗ trợ các giá trị âm cho bắt đầu, dừng hoặc bước. Có thể được sử dụng để trích xuất các trường liên quan từ dữ liệu có cấu trúc bên trong đã được làm phẳng [ví dụ: báo cáo nhiều dòng có thể liệt kê một trường tên trên mỗi dòng thứ ba]

Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
55

itertools. theo cặp[có thể lặp lại]

Trả về các cặp chồng chéo liên tiếp được lấy từ đầu vào có thể lặp lại

Số lượng 2 bộ trong trình vòng lặp đầu ra sẽ ít hơn một lần so với số lượng đầu vào. Nó sẽ trống nếu đầu vào có thể lặp lại có ít hơn hai giá trị

Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
56

Mới trong phiên bản 3. 10

itertools. hoán vị[có thể lặp lại , r=None]

Trả về các hoán vị chiều dài r liên tiếp của các phần tử trong iterable

Nếu r không được chỉ định hoặc là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19, thì r mặc định là độ dài của lần lặp và tất cả các hoán vị độ dài đầy đủ có thể được tạo

Các bộ hoán vị được phát ra theo thứ tự từ điển theo thứ tự của đầu vào có thể lặp lại. Vì vậy, nếu lần lặp đầu vào được sắp xếp, các bộ dữ liệu đầu ra sẽ được tạo theo thứ tự đã sắp xếp

Các yếu tố được coi là duy nhất dựa trên vị trí của chúng, không dựa trên giá trị của chúng. Vì vậy, nếu các phần tử đầu vào là duy nhất, sẽ không có giá trị lặp lại trong một hoán vị

Gần tương đương với

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
57

Mã cho

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
17 cũng có thể được biểu thị dưới dạng chuỗi con của
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
16, được lọc để loại trừ các mục có phần tử lặp lại [những mục từ cùng một vị trí trong nhóm đầu vào]

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
58

Số lượng mặt hàng được trả lại là

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
513 khi
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
28 hoặc bằng 0 khi
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
29

itertools. sản phẩm[*có thể lặp lại , repeat=1]

Sản phẩm Descartes của các lần lặp đầu vào

Gần tương đương với các vòng lặp for lồng nhau trong biểu thức trình tạo. Ví dụ:

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
516 trả về giống như
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
517

Các vòng lặp lồng nhau giống như một máy đo đường với phần tử ngoài cùng bên phải tăng dần trên mỗi lần lặp. Mẫu này tạo ra một thứ tự từ điển để nếu các lần lặp của đầu vào được sắp xếp, các bộ sản phẩm được phát ra theo thứ tự đã sắp xếp

Để tính tích của một lần lặp với chính nó, hãy chỉ định số lần lặp lại với đối số từ khóa lặp lại tùy chọn. Ví dụ:

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
518 có nghĩa giống như
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
519

Hàm này gần tương đương với đoạn mã sau, ngoại trừ việc triển khai thực tế không tạo kết quả trung gian trong bộ nhớ

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
59

Trước khi

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
16 chạy, nó tiêu thụ hoàn toàn các lần lặp đầu vào, giữ các nhóm giá trị trong bộ nhớ để tạo sản phẩm. Theo đó, nó chỉ hữu ích với đầu vào hữu hạn

itertools. lặp lại[đối tượng[ , times]]

Tạo một trình vòng lặp trả về đối tượng nhiều lần. Chạy vô thời hạn trừ khi đối số lần được chỉ định

Gần tương đương với

def chain[*iterables]:
    # chain['ABC', 'DEF'] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
0

Một cách sử dụng phổ biến để lặp lại là cung cấp một luồng giá trị không đổi cho ánh xạ hoặc zip

def chain[*iterables]:
    # chain['ABC', 'DEF'] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1

itertools. starmap[chức năng , có thể lặp lại]

Tạo một trình lặp tính toán hàm bằng cách sử dụng các đối số thu được từ trình lặp. Được sử dụng thay cho

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1 khi các tham số đối số đã được nhóm trong các bộ dữ liệu từ một lần lặp duy nhất [khi dữ liệu đã được “nén trước”]

Sự khác biệt giữa

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1 và
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19 tương đương với sự khác biệt giữa
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
524 và
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
525. Gần tương đương với

def chain[*iterables]:
    # chain['ABC', 'DEF'] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
2

itertools. taketime[vị ngữ , có thể lặp lại]

Tạo một iterator trả về các phần tử từ iterable miễn là vị từ là đúng. Gần tương đương với

def chain[*iterables]:
    # chain['ABC', 'DEF'] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
3

itertools. tee[có thể lặp lại , n=2]

Trả về n trình vòng lặp độc lập từ một lần lặp duy nhất

Mã Python sau đây giúp giải thích chức năng của tee [mặc dù việc triển khai thực tế phức tạp hơn và chỉ sử dụng một hàng đợi FIFO bên dưới]

def chain[*iterables]:
    # chain['ABC', 'DEF'] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
4

Khi một

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
13 đã được tạo, bản gốc có thể lặp lại không được sử dụng ở bất kỳ nơi nào khác;

Trình vòng lặp

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
527 không phải là luồng an toàn. Một
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
528 có thể được nâng lên khi sử dụng đồng thời các trình lặp được trả về bởi cùng một lệnh gọi
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
13, ngay cả khi trình lặp ban đầu là luồng an toàn

Itertool này có thể yêu cầu bộ nhớ phụ đáng kể [tùy thuộc vào lượng dữ liệu tạm thời cần được lưu trữ]. Nói chung, nếu một trình vòng lặp sử dụng hầu hết hoặc tất cả dữ liệu trước khi một trình vòng lặp khác bắt đầu, thì việc sử dụng

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
530 thay vì
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
13 sẽ nhanh hơn

itertools. zip_longest[*có thể lặp lại , fillvalue=None]

Tạo một trình lặp tổng hợp các phần tử từ mỗi lần lặp. Nếu các lần lặp có độ dài không đồng đều, các giá trị bị thiếu sẽ được điền vào bằng giá trị điền. Lặp lại tiếp tục cho đến khi hết lần lặp dài nhất. Gần tương đương với

def chain[*iterables]:
    # chain['ABC', 'DEF'] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
5

Nếu một trong các lần lặp có khả năng là vô hạn, thì hàm

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
14 phải được gói bằng thứ gì đó giới hạn số lần gọi [ví dụ:
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
15 hoặc
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
11]. Nếu không được chỉ định, giá trị điền mặc định là
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
19

Công thức Itertools¶

Phần này hiển thị các công thức để tạo bộ công cụ mở rộng bằng cách sử dụng các công cụ lặp hiện có làm khối xây dựng

Mục đích chính của công thức itertools là giáo dục. Các công thức cho thấy nhiều cách suy nghĩ khác nhau về các công cụ riêng lẻ - ví dụ:

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
536 có liên quan đến khái niệm làm phẳng. Các công thức nấu ăn cũng đưa ra ý tưởng về cách kết hợp các công cụ — ví dụ: cách
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
18 và
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
538 có thể hoạt động cùng nhau. Các công thức nấu ăn cũng hiển thị các mẫu sử dụng itertools với các mô-đun
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
4 và
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
540 cũng như với các itertools tích hợp như
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
1,
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
542,
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
543 và
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
544

Mục đích phụ của các công thức nấu ăn là để phục vụ như một lồng ấp. Các công cụ lặp

def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
12,
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
18 và
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
17 bắt đầu dưới dạng công thức nấu ăn. Hiện tại, công thức
def from_iterable[iterables]:
    # chain.from_iterable[['ABC', 'DEF']] --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
548 đang được thử nghiệm để xem liệu nó có chứng minh được giá trị của nó hay không

Về cơ bản, tất cả các công thức này và nhiều, rất nhiều công thức khác có thể được cài đặt từ dự án more-itertools được tìm thấy trên Chỉ mục gói Python

Chủ Đề