2012-04-28 39 views
21

thể trùng lặp:
How do you split a list into evenly sized chunks in Python?
python: convert “5,4,2,4,1,0” into [[5, 4], [2, 4], [1, 0]]Làm thế nào để tách danh sách python thành các khối có kích thước bằng nhau?

[1,2,3,4,5,6,7,8,9] 

->

[[1,2,3],[4,5,6],[7,8,9]] 

Có cách đơn giản để làm điều đó, không rõ ràng 'cho'?

+0

Điều gì sẽ xảy ra nếu số lượng mục trong danh sách không chia hết cho kích thước chunk? –

+1

Điều này đã được [hỏi trước] (http://stackoverflow.com/a/5084126/298607) – dawg

Trả lời

60
>>> x = [1,2,3,4,5,6,7,8,9] 
>>> zip(*[iter(x)]*3) 
[(1, 2, 3), (4, 5, 6), (7, 8, 9)] 

How does zip(*[iter(s)]*n) work in Python?

+3

Giải thích một chút: P – Serdalis

+1

Điều này đã được giải thích trước đây nhưng tôi sẽ tìm thấy một liên kết. – jamylak

+2

Đó là cực kỳ thông minh, nhưng tôi đoán nó là pythonic. – ddaa

8

Bạn có thể sử dụng numpy.reshape đây cũng như:

import numpy as np 

x = np.array([1,2,3,4,5,6,7,8,9]) 

new_x = np.reshape(x, (3,3)) 

Kết quả:

>>> new_x 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 
+0

trông rất sạch sẽ;) Tuy nhiên ... thêm toàn bộ numpy cho dự án chỉ vì lợi ích đó;) – andi

0

Dưới đây là một "thông minh" cách để làm việc đó với đệ quy ít hơn nhiều:

from itertools import chain 

def groupsof(n, xs): 
    if len(xs) < n: 
     return [xs] 
    else: 
     return chain([xs[0:n]], groupsof(n, xs[n:])) 

print list(groupsof(3, [1,2,3,4,5,6,7,8,9,10,11,12,13])) 
6
>>> map(None,*[iter(s)]*3) 
[(1, 2, 3), (4, 5, 6), (7, 8, 9)] 
+1

Điều này chỉ có vẻ giống như một phiên bản ít có thể đọc được của tôi mã số ... – jamylak

+0

Mã chính xác này được cung cấp trong câu trả lời được chấp nhận trong liên kết trong bài đăng của jamylak. – Akavall

+0

Tôi đoán rằng nó không quan trọng để biết rằng nó hoạt động nhưng tôi sẽ không khuyên bạn nên sử dụng nó vì những gì tôi đã nói trước đây. – jamylak

13

Nếu bạn thực sự muốn các yếu tố phụ là danh sách vs tuples:

In [9]: [list(t) for t in zip(*[iter(range(1,10))]*3)] 
Out[9]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

Hoặc, nếu bạn muốn bao gồm các trái qua yếu tố đó sẽ được rút ngắn bởi zip, sử dụng cú pháp lát :

In [16]: l=range(14) 

In [17]: [l[i:i+3] for i in range(0,len(l),3)] 
Out[17]: [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]] 
+1

Tôi thích phiên bản này – Arsham

+1

Phiên bản này không loại bỏ phần còn lại "còn lại" nên đó là lựa chọn của tôi. – chirale

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