2012-02-24 35 views
6

Tôi có một máy phát điện mà tôi muốn lặp qua ở hai cấp độ. Cấp độ đầu tiên là khoảng cách không đồng đều, sau đó tôi muốn chia cấp độ tiếp theo thành các nhóm 5, nói. Tôi cần nó để có bộ nhớ hiệu quả và làm việc trên đầu vào máy phát điện, vì vậy tôi đang làm một cái gì đó như sau. Tôi phải nghĩ rằng có thể có một cách tốt hơn? Đặc biệt, tôi không muốn các Nones sau trong các kết quả chiều dài không đồng đều.cá mú với một chuỗi kích thước chunk trong python?

import itertools 

def dynamic_grouper(iterable, intervals): 
    for i in intervals: 
     inner_iter = list(itertools.islice(iterable, i)) # this is a "group" 
     yield inner_iter 

iterable = iter(xrange(100)) 
chunk_sizes = [22,30,38,10] 

for i,group in enumerate(dynamic_grouper(iterable, chunk_sizes)): 
    args = [iter(group)] * 5 
    for item in itertools.izip_longest(fillvalue=None, *args): 
     print "Group %i" % i 
     print "Items %s" % list(item) 

Trả lời

5

Để tránh None s, bạn có thể sử dụng chunks:

def chunks(seq, n): 
    # https://stackoverflow.com/a/312464/190597 (Ned Batchelder) 
    """ Yield successive n-sized chunks from seq.""" 
    for i in xrange(0, len(seq), n): 
     yield seq[i:i + n] 

for i,group in enumerate(dynamic_grouper(iterable, chunk_sizes)): 
    for item in chunks(group, 5): 
     print "Group %i" % i 
     print "Items %s" % list(item) 
+0

Cảm ơn, điều này có vẻ như nó hiện các trick. – jseabold

+0

Tác dụng của 'len (l)' trên 'l' nếu nó là máy phát điện? Sẽ không ép buộc đọc đầy đủ 'l', ví dụ: 'khối (file.readlines(), 2)'? – Harvey

+0

'l' là một danh sách, không phải là một máy phát điện. Áp dụng 'len' vào máy phát sẽ làm tăng TypeError. Lưu ý rằng 'dynamic_grouper' là các danh sách năng suất, như vậy ở trên,' nhóm' là một danh sách. Vì vậy, gọi 'khối (nhóm, 5)' là okay. – unutbu

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