Sự khác biệt giữa liệt kê và zip trong python

Chào mừng đến với ngày thứ 9 của loạt bài 30 Days of Python. Hôm nay chúng ta sẽ xem xét một kỹ thuật lặp thực sự hữu ích được gọi là giải nén. Chúng ta cũng sẽ khám phá một số chức năng mới.

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6 và
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7

Nếu bạn bỏ lỡ bài đăng ngày hôm qua, chúng tôi đã đề cập đến một cấu trúc rất quan trọng được gọi là vòng lặp

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
8, vì vậy tôi khuyên bạn nên xem qua nếu đó là thứ bạn chưa quen

giải nén

Giải nén thường được sử dụng để thực hiện một số nhiệm vụ cùng một lúc, bằng cách trích xuất các giá trị riêng lẻ từ một số lần lặp. Quá trình này còn được gọi là phá hủy

Hãy xem xét một trường hợp rất đơn giản. Có lẽ tôi có một bản ghi phim, đó là một bộ dữ liệu và chứa tên phim, tên đạo diễn và năm phát hành. Điều tôi muốn làm là gán các giá trị của bộ dữ liệu này cho ba biến.

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
9,
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
0 và
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
1

Với kiến ​​thức hiện tại của chúng tôi, chúng tôi phải làm một cái gì đó như thế này

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title = movie[0]
director = movie[1]
year = movie[2]

Tuy nhiên, điều này hơi tẻ nhạt và may mắn thay, có một cách tốt hơn nhiều. Thay vì viết các bài tập riêng biệt và truy cập các chỉ mục, chúng ta chỉ cần viết cái này

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie

Điều đang xảy ra ở đây là Python thấy rằng chúng ta có ba tên mà chúng ta muốn gán cho và bộ mà chúng ta đang gán cho nó có ba phần tử. Do đó, nó lấy một mục từ các bộ, mỗi lần một mục và gán các giá trị này cho các tên theo thứ tự

Số lượng tên phải khớp với số lượng phần tử trong iterable, nếu không chúng ta sẽ nhận được một ngoại lệ như thế này

________số 8

Chúng tôi không giới hạn chỉ các bộ dữ liệu ở đây. chúng ta có thể sử dụng danh sách hoặc bất kỳ loại có thể lặp lại nào khác. Điều này cực kỳ hữu ích và chúng ta có thể sử dụng kỹ thuật này theo vòng lặp để đạt được hiệu quả tuyệt vời, như chúng ta sắp thấy

Giải nén trong các vòng lặp

Hãy quay lại ví dụ thư viện phim của chúng tôi, nơi chúng tôi có một danh sách chứa một số bộ phim

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

Khi chúng tôi lần đầu tiên tìm kiếm các vòng lặp, chúng tôi đã có một ví dụ trong đó chúng tôi in các giá trị từ mỗi bộ dữ liệu này theo cách tốt đẹp cho người dùng để họ có thể xem tất cả các bộ phim của họ

Vòng lặp trông như thế này

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]

Vòng lặp này hoạt động hoàn toàn tốt, nhưng có một điều không tuyệt vời là các giá trị thực sự không rõ ràng.

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
2 là gì? . Sẽ tốt hơn nhiều nếu chúng ta có thể sử dụng những cái tên đẹp, mang tính mô tả ở đây để thay thế

Hãy nghĩ xem điều gì sẽ xảy ra khi chúng ta lặp lại

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3. Đối với mỗi lần lặp lại,
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3 sẽ cung cấp cho chúng tôi một bộ dữ liệu duy nhất và chúng tôi sẽ gán giá trị này cho
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
5

Nếu chúng ta nghĩ về nó, điều đó rất giống với việc làm này

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
5

Chúng tôi có một tên,

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
5, và chúng tôi đang gán một bộ dữ liệu cho nó. Trong trường hợp này, chúng ta có bộ dữ liệu thứ hai từ danh sách
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3

Tuy nhiên, chúng ta vừa thấy một ví dụ về một bộ như thế này được giải nén thành ba biến, như vậy

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
8

Hóa ra, chúng ta có thể làm chính xác điều tương tự trong vòng lặp for của mình

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
9

Đối với mỗi lần lặp lại của vòng lặp,

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3 cung cấp cho chúng tôi một bộ dữ liệu duy nhất. Python thấy rằng bộ dữ liệu có ba giá trị trong đó và chúng tôi đã xác định ba tên. Do đó, nó lấy phần tử đầu tiên trong bộ dữ liệu và gán nó với tên
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
9;

Bằng cách sử dụng tính năng giải nén ở đây, chúng tôi đã làm cho cuộc gọi

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
52 của mình dễ đọc hơn rất nhiều, bởi vì thay vì đề cập đến các chỉ mục, chúng tôi có các tên mô tả rõ ràng

Nếu bạn muốn tìm hiểu thêm về kỹ thuật này, chúng tôi có một bài đăng trên blog đi sâu vào chi tiết hơn

liệt kê

Một ứng dụng phổ biến để giải nén là khi sử dụng hàm có tên là

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6

Trước khi chúng tôi xem xét chính chức năng đó, tôi muốn thêm một phần chức năng vào vòng lặp in của chúng tôi. Cũng như thông tin về phim, tôi muốn bắt đầu mỗi dòng bằng một số, đại diện cho thứ tự của các bộ phim

Nói cách khác, tôi muốn đầu ra như thế này

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6

Làm thế nào chúng ta sẽ đi về điều này?

Thông qua một số phương tiện, chúng ta sẽ cần tạo ra một số loại bộ đếm. Đây là một giải pháp rất phổ biến cho vấn đề này mà tôi thấy mọi lúc

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7

Rất rõ ràng, trong khi loại giải pháp này là phổ biến, nó không phải là một giải pháp tốt. Điều này rõ ràng rất khó đọc và chúng tôi đã mất tất cả những cái tên tuyệt vời của mình

Để đầy đủ, hãy nói về cách thức hoạt động của nó, bởi vì tôi đảm bảo rằng bạn sẽ thấy các giải pháp như thế này vào một lúc nào đó

Đầu tiên, chúng ta gọi hàm này là

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
54 để tìm xem có bao nhiêu phim trong danh sách
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3. Trong trường hợp của chúng tôi, có ________ 156 phim, vì vậy ________ 157 sẽ đánh giá thành _________ 156

Giá trị này,

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
56, sau đó được chuyển vào
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
80. Như chúng ta đã thấy trong ngày thứ 6, nếu chúng ta chuyển một giá trị duy nhất cho
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
80, nó sẽ cho chúng ta một chuỗi giá trị từ
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
82 cho đến [nhưng không bao gồm] số mà chúng ta đã chuyển vào. Do đó,
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
80 của chúng tôi trông như thế này

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
0

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
80 là một iterable và giá trị đầu tiên mà nó sẽ cung cấp cho chúng ta là
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
82, giá trị mà chúng ta đang gán cho tên này là
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
86. Sau đó, chúng tôi sử dụng giá trị này để tra cứu một bộ phim trong
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3

Hãy nhớ rằng

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
88 sẽ cho chúng ta bộ phim đầu tiên trong danh sách và
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
89 cho chúng ta giá trị thứ hai, v.v.

Khi chúng tôi xem qua các giá trị

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
80, số lượng tăng lên và cuối cùng chúng tôi sẽ xem lần lượt từng phim. Đối với mỗi bộ phim, chúng tôi đang truy cập dữ liệu mà chúng tôi muốn bằng cách sử dụng một biểu thức đăng ký khác [cú pháp dấu ngoặc vuông], giống như chúng tôi đã làm trước đây

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
86 cũng đóng vai trò là quầy của chúng tôi. Đối với lần lặp đầu tiên, nó là
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
82, vì vậy chúng tôi chỉ cần thêm
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
93 vào nó để có số
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
93 được in bên cạnh những bộ phim đầu tiên của chúng tôi. Sau đó, nó tăng thêm 193 mỗi lần, cho chúng tôi một bộ đếm tăng dần khi bắt đầu đầu ra bản in của chúng tôi

Được rồi, vì vậy đây không phải là một giải pháp tuyệt vời, nhưng cách tốt hơn là gì?

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
1

Chúng tôi chưa từng thấy cú pháp

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
96 này trước đây, nhưng
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
97 là cách viết tắt để viết cú pháp này

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
2

Đây là một giải pháp tốt hơn nhiều, nhưng hiện tại chúng tôi có cuốn sách này đang thay đổi và tôi không thực sự thích điều đó. Theo tôi, một giải pháp tốt hơn là sử dụng

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6 là một hàm tích hợp tạo bộ đếm cùng với các giá trị trong một lần lặp. Những gì chúng tôi kết thúc là một loạt các bộ dữ liệu, trong đó phần tử đầu tiên trong mỗi bộ dữ liệu là bộ đếm và giá trị thứ hai là phần tử ban đầu từ bộ lặp

Trước tiên hãy xem một ví dụ đơn giản. Tôi chỉ muốn tạo một bộ đếm cùng với danh sách tên. Chúng ta có thể làm điều này như vậy

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
3

Cái mà

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6 chứa trong trường hợp này là một loạt các bộ dữ liệu như thế này

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
4

Và đầu ra của chúng tôi trông như thế này

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
5

Đây không phải là điều tôi muốn, vì tôi muốn các giá trị bắt đầu từ

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
93. Đây là một cách khắc phục dễ dàng, bởi vì chúng tôi có thể đặt giá trị bắt đầu cho bộ đếm khi chúng tôi gọi
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
6

Bây giờ chúng tôi nhận được đầu ra mà chúng tôi muốn

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
7

Hãy quay lại ví dụ ban đầu của chúng ta với các bộ phim. Mọi thứ ở đây không dễ dàng như vậy, bởi vì bản thân mỗi phần tử của chúng ta là một bộ. Chúng ta chỉ có thể làm điều này

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
8

Đây là kết quả của

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6 là như thế này

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
9

Vì vậy,

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
64 lấy giá trị của mỗi số ở vị trí đầu tiên [
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
93,
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
66 và
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
56]. Và
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
5 lấy giá trị của mỗi bộ ở vị trí thứ hai [chẳng hạn như
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
69]

Tuy nhiên, tôi vẫn muốn có thể giải nén bộ phim này thành các tên biến mô tả mà chúng tôi đã có trước đây. Nhưng làm thế nào để chúng ta giải nén một cái gì đó như thế này

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
0

Tất cả những gì chúng ta phải làm là khớp với cấu trúc của thứ mà chúng ta muốn giải nén. Ở đây chúng ta có một bộ hai phần tử, trong đó phần tử thứ hai là một bộ ba phần tử. Vì vậy, chúng tôi có thể giải nén cấu trúc này ở trên như vậy

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
1

Trong vòng lặp của chúng tôi, chúng tôi chỉ cần làm điều tương tự

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
2

Lưu ý rằng các dấu ngoặc ở đây thực sự quan trọng. Nếu chúng ta viết điều này,

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
3

chúng tôi sẽ nhận được một

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
70, bởi vì chúng tôi đã cung cấp bốn tên, nhưng chỉ có hai giá trị. bộ đếm và bộ phim. Bằng cách sử dụng các dấu ngoặc đơn này, chúng tôi xác định rằng chúng tôi muốn giá trị thứ hai này [bộ] được chia thành ba tên riêng biệt

Hàm
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 là một chức năng cực kỳ mạnh mẽ và linh hoạt được sử dụng để kết hợp hai hoặc nhiều lần lặp thành một lần lặp duy nhất

Ví dụ: giả sử chúng ta có hai danh sách như thế này

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
4

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 sẽ cho phép chúng tôi biến điều này thành một lần lặp mới có chứa những điều sau đây

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
5

Về bản chất, nó lấy mục đầu tiên từ mỗi lần lặp và đặt chúng lại với nhau trong một bộ dữ liệu. Sau đó, nó lấy mục thứ hai từ mỗi lần lặp, v.v., cho đến khi một trong các lần lặp hết giá trị. Chúng ta sẽ quay lại vấn đề này sau, vì nó thực sự quan trọng

Để sử dụng

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7, tất cả những gì chúng ta phải làm là gọi hàm và chuyển vào các lần lặp mà chúng ta muốn nén lại với nhau

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
6

Nếu chúng tôi muốn nén ba hoặc thậm chí nhiều lần lặp lại với nhau, chúng tôi có thể tiếp tục chuyển ngày càng nhiều mục hơn tới

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 khi chúng tôi gọi nó

Giống như

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
80,
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 lười biếng, có nghĩa là nó chỉ tính toán giá trị tiếp theo khi chúng tôi yêu cầu. Do đó, chúng tôi không thể in nó trực tiếp, nhưng chúng tôi có thể chuyển đổi nó thành một thứ gì đó giống như một danh sách nếu chúng tôi muốn xem đầu ra

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
7

Sử dụng
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 trong các vòng lặp

Một cách rất phổ biến khác để sử dụng

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 là lặp lại hai hoặc nhiều lần lặp lại cùng một lúc trong một vòng lặp for

Hãy quay lại ví dụ về chủ sở hữu thú cưng của chúng ta, nhưng bây giờ tôi muốn in một số đầu ra mô tả ai sở hữu thú cưng nào

Chúng ta có thể sử dụng

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 và một chút phá hủy để làm điều này một cách thực sự rõ ràng, bởi vì chúng ta có thể sử dụng các tên biến rõ ràng đẹp đẽ trong vòng lặp

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
8

Cách thay thế phổ biến cho việc sử dụng

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 là mẫu
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
80 +
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
54 khó chịu mà chúng ta đã thấy trước đó với
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6. Tôi khuyên bạn nên tránh điều đó bằng mọi giá

Lưu ý khi sử dụng
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6 và
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7

Một điều bạn cần lưu ý khi nói đến

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6 và
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 là chúng được tiêu thụ khi chúng ta lặp lại chúng. Điều này thường không phải là vấn đề khi chúng ta sử dụng chúng trực tiếp trong các vòng lặp, nhưng đôi khi nó có thể gây khó khăn cho các nhà phát triển mới hơn khi họ gán một đối tượng
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 hoặc
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6 cho một biến

Đây là một ví dụ mà chúng ta gán kết quả của việc gọi

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 cho một biến

Traceback [most recent call last]:
  File "main.py", line 3, in 
    title, director, year = movie
ValueError: not enough values to unpack [expected 3, got 2]
9

Chúng tôi có thể lặp lại các bộ phim mà không gặp vấn đề gì

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
0

Tuy nhiên, nếu bây giờ chúng tôi cố gắng sử dụng lại

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3, chúng tôi sẽ thấy rằng nó trống. Hãy thử chạy đoạn mã dưới đây để xem điều này

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
1

Nếu bạn cố gắng lặp lại

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3 sau vòng lặp ban đầu, bạn cũng sẽ thấy rằng nó không chứa giá trị nào

Lý do điều này xảy ra là bởi vì

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7 và
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6 tạo ra một thứ gọi là iterator. Chúng ta sẽ không nói sâu về các trình vòng lặp trong loạt bài này, vì các trình vòng lặp là một chủ đề nâng cao, nhưng một tính năng chính của các trình vòng lặp là chúng được sử dụng khi chúng ta yêu cầu các giá trị của chúng. Đây thực sự là một tính năng thực sự hữu ích, nhưng nó cũng là một nguồn lỗi phổ biến nếu bạn không quen với hành vi này

Một cách dễ dàng để vượt qua giới hạn này là chỉ cần chuyển đổi iterator thành một bộ sưu tập không iterator, chẳng hạn như danh sách hoặc bộ dữ liệu

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
2

Bây giờ chúng ta có thể truy cập các giá trị trong

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]

for movie in movies:
    print[f"{movie[0]} [{movie[2]}], by {movie[1]}"]
3 bao nhiêu lần tùy thích

bài tập

1] Dưới đây là một số dữ liệu đơn giản về các nhân vật trong BoJack Horseman

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
3

Dữ liệu chứa tên nhân vật, diễn viên lồng tiếng hoặc nữ diễn viên đóng vai họ và loài của nhân vật

Viết một vòng lặp for sử dụng hàm hủy để bạn có thể in từng bộ theo định dạng sau

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
4

Lưu ý rằng bạn sẽ phải thay đổi thông tin loài thành chữ thường khi in. Nếu bạn cần lời nhắc về cách thực hiện việc này, chúng tôi đã đề cập đến nó vào ngày thứ 3 của tuần đầu tiên

2] Giải nén bộ dữ liệu sau thành 4 biến

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
5

Dữ liệu đại diện cho tên của sinh viên, mã số sinh viên của họ và các ngành học chính và phụ của họ theo thứ tự đó

3] Điều tra điều gì sẽ xảy ra khi bạn cố nén hai lần lặp có độ dài khác nhau. Ví dụ: thử nén một danh sách chứa ba mục và một bộ chứa bốn mục

Bạn có thể tìm lời giải của chúng tôi cho các bài tập ở đây

Dự án

Khi bạn đã hoàn thành các bài tập, chúng tôi có một dự án khác cho bạn hôm nay. Lần này chúng tôi đang viết một chương trình ngắn để xác thực thẻ tín dụng

tài nguyên bổ sung

Nếu bạn muốn tìm hiểu thêm về cách giải nén, chúng tôi có một bài đăng trên blog đi sâu vào chi tiết hơn

Chúng tôi cũng có một bài đăng trên blog về

movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
6, bạn có thể tìm thấy ở đây và một bài đăng trên
movies = [
    [
        "Eternal Sunshine of the Spotless Mind",
        "Michel Gondry",
        2004
    ],
    [
        "Memento",
        "Christopher Nolan",
        2000
    ],
    [
        "Requiem for a Dream",
        "Darren Aronofsky",
        2000
    ]
]
7, bạn có thể đọc ở đây

Ngoài tất cả những điều này, chúng tôi có một bài viết nói về một chức năng khác gọi là

movie = ["12 Angry Men", "Sidney Lumet", 1957]

title, director, year = movie
19. Điều này cho phép chúng tôi nén các bộ sưu tập có kích thước khác nhau mà không làm mất dữ liệu, nhưng nó yêu cầu một số kỹ thuật mà chúng tôi chưa xem xét, chẳng hạn như nhập mã từ các tệp khác. Nếu bạn quan tâm, bạn có thể tìm thấy bài viết đó ở đây

Sự khác biệt giữa liệt kê và zip là gì?

Không còn nghi ngờ gì nữa, zip mang tính Pythonic hơn . Nó không yêu cầu bạn sử dụng một biến để lưu trữ một chỉ mục [mà bạn không cần] và việc sử dụng nó cho phép xử lý các danh sách một cách thống nhất, trong khi với enumerate , bạn lặp qua một danh sách và lập chỉ mục cho danh sách khác, tôi. e. xử lý không thống nhất.

Bạn có thể sử dụng liệt kê với zip không?

Nếu bạn muốn lấy các thành phần của nhiều danh sách và chỉ mục, bạn có thể sử dụng enumerate[] và zip[] cùng nhau . Trong trường hợp này, bạn cần đặt các phần tử của hàm zip[] trong ngoặc đơn, như đối với i, [a, b,. ] trong liệt kê [zip [. ]]. Bạn cũng có thể nhận các phần tử của zip[] dưới dạng một bộ.

Sự khác biệt giữa liệt kê và phạm vi trong Python là gì?

Thay vì sử dụng hàm range[], chúng ta có thể sử dụng hàm enumerate[] có sẵn trong python. enumerate[] cho phép chúng ta lặp qua một chuỗi nhưng nó theo dõi cả chỉ mục và phần tử . Hàm enumerate[] nhận một đối số có thể lặp lại, chẳng hạn như danh sách, chuỗi, bộ hoặc từ điển.

zip[] nghĩa là gì trong Python?

Hàm zip[] của Python tạo một trình vòng lặp sẽ tổng hợp các phần tử từ hai hoặc nhiều vòng lặp . Bạn có thể sử dụng trình vòng lặp kết quả để giải quyết các vấn đề lập trình phổ biến một cách nhanh chóng và nhất quán, chẳng hạn như tạo từ điển.

Chủ Đề