2016-05-03 3 views
1

Я хочу разбить данный список python на куски, похожие на следующую ссылку, но в обратном порядке.Список Python, разбитый на куски (BACKWARDS)

How do you split a list into evenly sized chunks in Python?

В настоящее время forward_chunk([1,2,3],2) = [[1,2], [3]]

Однако я хочу backward_chunk([1,2,3],2) = [[1], [2,3]]

# what I currently have 
def forward_chunk(list, size): 
    for i in range(0, len(list), size): 
     yield list[i:i+size] 

Я не могу за жизнь мне сделать все диапазоны и список ломтиков работать для того, чтобы достичь обратной цели. У кого-нибудь есть идеи?

ответ

2

Sth. например:

def backward_chunk(l, size): 
    start = 0 
    for end in range(len(l)%size, len(l)+1, size): 
     yield l[start:end] 
     start = end 

> list(backward_chunk([1, 2, 3], 2)) 
[[1], [2, 3]] 

Первый размер куска рассчитывается как по модулю длины списка и общего размера куска. И, пожалуйста, не вызывайте переменные list.

2

Найдите, сколько дополнительных элементов будет, разделите список пополам, произведите первую часть, затем выполните операцию куска и отдайте все остальное.

def forward_chunk(lst, size): 
    piece = len(lst) % size 
    piece, lst = lst[:piece], lst[piece:] 
    yield piece 
    for i in range(0, len(lst), size): 
     yield lst[i:i+size] 
0

Вы можете использовать обычный генератор кусков и, если хотите, изменить список.

def chunk(data, size, reverse=False): 
    data = data[::-1] if reverse else data 
    for n in range(0, len(data), size): 
     yield data[n:n+size] 

Пример использования:

info = [1, 2, 3, 4, 5, 6, 7, 8] 
for i in chunk(info, 4): 
    print(i) # => [1, 2, 3, 4], [5, 6, 7, 8] 
for i in chunk(info, 4, True): 
    print(i) # => [8, 7, 6, 5], [4, 3, 2, 1] 

Если вы хотите только в обратном порядке, а не сам список, просто выход data[n:n+size][::-1]reverse если это True.

Смежные вопросы