2013-08-19 39 views
6

Đối với một số mã tôi viết, tôi cần phải lặp 1-30 bỏ qua 6. Những gì tôi cố gắng ngây thơ làLàm thế nào tôi có thể kết hợp nhiều() chức năng

a = range(1,6) 
b = range(7,31) 

for i in a+b: 
    print i 

Có cách nào để làm điều đó hơn hiệu quả?

+5

Những gì bạn đã gửi tác phẩm. Chính xác là bạn đang hỏi cái gì? Có cách nào để làm điều đó 'tốt hơn' không? –

+1

Các công trình trên trong python2, nhưng không python3 –

Trả lời

10

Trong python 2 bạn không kết hợp "chức năng phạm vi"; đây chỉ là danh sách. Ví dụ của bạn hoạt động tốt. Nhưng dao động luôn luôn tạo ra một danh sách đầy đủ trong bộ nhớ, do đó, một cách tốt hơn nếu chỉ cần thiết trong vòng lặp for có thể là để sử dụng một biểu thức máy phát điện và xrange:

range_with_holes = (j for j in xrange(1, 31) if j != 6) 

for i in range_with_holes: 
    .... 

Trong biểu hiện máy phát điện nếu một phần có thể chứa một logic phức tạp trên con số nào cần bỏ qua.

Một cách khác để kết hợp iterables là sử dụng itertools.chain:

range_with_holes = itertools.chain(xrange(1, 6), xrange(7, 31)) 

Hoặc chỉ cần bỏ qua các chỉ số không mong muốn

for i in range(1, 31): 
    if i == 6: 
     continue 

    ... 
2

Một lựa chọn sẽ được sử dụng một danh sách bỏ qua, và kiểm tra chống lại rằng, với một cái gì đó như:

skips = [6, 42] 
for i in range(1,31): 
    if i in skips: 
     continue 
    print i 
10

Sử dụng itertools.chain:

import itertools 

a = range(1,6) 
b = range(7,31) 

for i in itertools.chain(a, b): 
    print i 

Hoặc khéo léo biểu thức máy phát điện phẳng:

a = range(1,6) 
b = range(7,31) 
for i in (x for y in (a, b) for x in y): 
    print i 

Hoặc bỏ qua biểu thức trình tạo:

skips = set((6,)) 
for i in (x for x in range(1, 31) if x not in skips): 
    print i 

Bất kỳ trong số này sẽ làm việc cho bất kỳ iterable (s), không chỉ range s bằng Python 3 hoặc lists s trong Python 2.