One-liner trả về một danh sách liệt kê, được đưa ra một danh sách và kích thước đoạn:.
>>> lol = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)]
Thử nghiệm:
>>> x = range(20, 36)
>>> print x
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
>>> lol(x, 4)
[[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31],
[32, 33, 34, 35]]
>>> lol(x, 7)
[[20, 21, 22, 23, 24, 25, 26],
[27, 28, 29, 30, 31, 32, 33],
[34, 35]]
Cập nhật:
Tôi nghĩ câu hỏi thực sự là yêu cầu là một chức năng mà, được đưa ra một danh sách và một số, trả về một danh sách có chứa $ danh sách (số), với các mục trong danh sách gốc được phân phối đồng đều. Vì vậy, ví dụ về lol (x, 7) của bạn thực sự phải trả về [[20,21,22], [23,24,25], [26,27], [28,29], [30,31], [32 , 33], [34,35]]. - markrian
Vâng, trong trường hợp này, bạn có thể thử:
def slice_list(input, size):
input_size = len(input)
slice_size = input_size/size
remain = input_size % size
result = []
iterator = iter(input)
for i in range(size):
result.append([])
for j in range(slice_size):
result[i].append(iterator.next())
if remain:
result[i].append(iterator.next())
remain -= 1
return result
tôi chắc chắn rằng điều này có thể được cải thiện nhưng tôi cảm thấy lười biếng.:-)
>>> slice_list(x, 7)
[[20, 21, 22], [23, 24, 25],
[26, 27], [28, 29],
[30, 31], [32, 33],
[34, 35]]
Bạn không đưa ra tên các bộ phận. Bạn trả về một danh sách các danh sách. – delnan
Cách tách? '[1,2,3,4,5, ... 100]' trở thành '[1,2,3, ...], [11,12,13, ...], ...' hoặc ' [1,11,21, ...], [2,12,22, ...], ... 'hoặc ngẫu nhiên hay cái gì? – kennytm
Tại sao không phải một danh sách hoặc danh sách khác, danh sách này sẽ chứa các danh sách phụ? Và sau đó tham khảo bằng cách sử dụng vị trí? Nó sẽ năng động hơn sau đó sử dụng các biến.
– khachik