Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 14, 2017 18:35:35

Ewgensky
Зарегистрирован: 2017-05-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбиение списка

День добрый. Стоит задача разбивать список (каждый раз произвольной длинны) на отрезки по N символов в каждом. Изучал материалы и форумы, и мне удалось найти только обратное задаче решение, когда заведомо известна длина списка, и нужно поделить его на равные (или примерно равные части). Код по обратному решению приложил. Тогда как требуется чтобы код, так скажем, “откусывал” по очереди от начала списка куски длиной N символов и упаковал их во вложенные списки, остаток тоже упаковывался бы. Фактически необходимо так написать код, чтобы вместо переменной “chunks_quantity”, которая задает деление списка на определенное количество частей, была заменена просто числом, которое сообщало бы коду какой длинны в символах должны быть отрезаемые куски.
Подскажите, пожалуйста, в какую сторону мне копать, чтобы написать такой код. Благодарю!

def chunkify_approximately(items, chunks_quantity):
chunk_len = len(items) / chunks_quantity
rest_count = len(items) % chunks_quantity

chunks =
for i in range(chunks_quantity):
chunk = items
items = items
if rest_count and items:
chunk.append(items.pop(0))
rest_count -= 1

chunks.append(chunk)

return chunks
Получаем:

>>> chunkify_approximately(range(2), 3)
[, , ]

>>> chunkify_approximately(range(8), 3)
[, , ]

>>> chunkify_approximately(range(12), 5)
[, , , , ]

Офлайн

#2 Ноя. 14, 2017 18:51:00

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Разбиение списка

 a = [
       'День', 'добрый.', 'Стоит', 'задача', 'разбивать', 'список', '(каждый', 'раз',
       'произвольной', 'длинны)', 'на', 'отрезки', 'по', 'N', 'символов', 'в', 'каждом', 'Подскажите,', 'пожалуйста,', 'в', 'какую',
       'сторону', 'мне', 'копать,', 'чтобы', 'написать', 'такой', 'код.', 'Благодарю!'
       ]
step =int(input()) # 5
for i in range(0,len(a),step):
    print(a[i:i+step])

 ['День', 'добрый.', 'Стоит', 'задача', 'разбивать']
['список', '(каждый', 'раз', 'произвольной', 'длинны)']
['на', 'отрезки', 'по', 'N', 'символов']
['в', 'каждом', 'Подскажите,', 'пожалуйста,', 'в']
['какую', 'сторону', 'мне', 'копать,', 'чтобы']
['написать', 'такой', 'код.', 'Благодарю!']

Офлайн

#3 Ноя. 14, 2017 19:12:45

Ewgensky
Зарегистрирован: 2017-05-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбиение списка

marvellik
Благодарю! Об использовании input и range и не подумал вовсе. Жму руку!

Офлайн

#4 Ноя. 14, 2017 19:16:07

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Разбиение списка

 >>> s = range(100)
>>> shag = 11
>>> [ s[:x] for x in [shag] * (len(s) // shag + (1 if len(s)%shag else 0)) ]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8,
 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5,
6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version