2013-01-31 28 views
8

Tôi thấy một hành vi lạ khi làm việc với hàm zip(). Khi tôi thực hiện các hoạt động sau len (danh sách (z)) trong đó z là một đối tượng zip, kết quả là 0 (mà có vẻ sai với tôi), và hành động dường như rõ ràng ra các đối tượng zip. Ai đó có thể giúp tôi hiểu chuyện gì đang diễn ra.Thực hiện len trên danh sách đối tượng zip xóa zip

# python3 
Python 3.2.3 (default, Sep 30 2012, 16:41:36) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> w = [11, 22, 33, 44, 55, 66] 
>>> x = [1, 2, 3, 4] 
>>> y = ['a', 'b', 'c'] 
>>> z = zip(x, y, w) 
>>> z 
<zip object at 0x7f854f613cb0> 
>>> list(z) 
[(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)] 
>>> len(list(z)) 
0 
>>> list(z) 
[] 
>>> z 
<zip object at 0x7f854f613cb0> 
>>> 

Cảm ơn bạn, Ahmed.

Trả lời

11

Trong Python 3 zip is a generator. Máy phát điện đang cạn kiệt khi bạn thực hiện list(z). Bạn có thể tạo một danh sách từ các giá trị được trả về bởi trình tạo và hoạt động trên đó.

l = list(z) 
len(l) 
# -> 3 
l 
# -> [(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)] 

Generators là một điều tốt. Chúng cho phép chúng ta viết mã hiệu quả của bộ nhớ trong gần giống như cách chúng ta viết mã tương ứng với các danh sách. Để sử dụng một ví dụ từ wiki liên kết:

def double(L): 
    return [x*2 for x in L] 

thể được viết lại như một máy phát điện để tránh tạo ra một danh sách trong bộ nhớ:

def double(L): 
    for x in L: 
     yield x*2 
+2

Đối với bất kỳ ai chỉ sử dụng Python 3, trong Python 2.x zip sẽ trả về danh sách các bộ dữ liệu. – TimothyAWiseman

+2

Cảm ơn bạn đã thêm điều đó. Ngoài ra, 'zip()' của Python 3 hoạt động giống như 'itertools.izip()' của 2x() ' – bernie

+0

Tất nhiên, bạn chỉ có thể viết' double' là 'double = (x * 2 cho x trong L)' –

3

để hoàn thành câu trả lời trước, có một thư viện Python gọi cardinality để nhận được kích thước của vòng lặp.

http://cardinality.readthedocs.io/en/latest/

Các vấn đề liên quan