2009-05-11 43 views
32

Tôi đã có một số mã như thế này:Làm cách nào để liệt kê() trên danh sách các bộ dữ liệu bằng Python?

letters = [('a', 'A'), ('b', 'B')] 
i = 0 
for (lowercase, uppercase) in letters: 
    print "Letter #%d is %s/%s" % (i, lowercase, uppercase) 
    i += 1 

Tôi đã được thông báo rằng có một chức năng enumerate() mà có thể chăm sóc "i" biến cho tôi:

for i, l in enumerate(['a', 'b', 'c']): 
    print "%d: %s" % (i, l) 

Tuy nhiên, tôi không thể tìm ra cách kết hợp hai cách: Làm cách nào để sử dụng liệt kê khi danh sách được đề cập đến được tạo thành từ bộ dữ liệu? Tôi có phải làm điều này không?

letters = [('a', 'A'), ('b', 'B')] 
for i, tuple in enumerate(letters): 
    (lowercase, uppercase) = tuple 
    print "Letter #%d is %s/%s" % (i, lowercase, uppercase) 

Hoặc có cách nào thanh lịch hơn không?

+0

enumerate vs itertools: những gì chúng ta nên đưa vào tài khoản khi lựa chọn giữa họ? – spazm

Trả lời

76

Đây là một cách gọn gàng để làm điều đó:

letters = [('a', 'A'), ('b', 'B')] 
for i, (lowercase, uppercase) in enumerate(letters): 
    print "Letter #%d is %s/%s" % (i, lowercase, uppercase) 
+1

Điều này được gọi là gì? Tôi muốn tìm hiểu thêm về cú pháp này. – Zak

+1

@Zak: Nếu bạn có nghĩa là gán cho '(chữ thường, chữ hoa)', nó được gọi là "giải nén". – RichieHindle

3

Đây là cách tôi muốn làm điều đó:

import itertools 

letters = [('a', 'A'), ('b', 'B')] 
for i, lower, upper in zip(itertools.count(),*zip(*letters)): 
    print "Letter #%d is %s/%s" % (i, lower, upper) 

EDIT: giải nén trở nên dư thừa. Đây là một cách nhỏ gọn hơn, mà có thể làm việc hay không tùy thuộc vào trường hợp sử dụng của bạn:

import itertools 

letters = [('a', 'A'), ('b', 'B')] 
for i in zip(itertools.count(),*zip(*letters)): 
    print "Letter #%d is %s/%s" % i 
0

Bạn có thể làm theo cách này quá:

letters = [('a', 'A'), ('b', 'B')] 
for i, letter in enumerate(letters): 
    print "Letter #%d is %s/%s" % (i, letter[0], letter[1]) 
Các vấn đề liên quan