@Lepilov

Как получить из списка списков новый список с определенной длиной?

Есть такой список
data = [
    
    ['customers/2309565764/assets/34830517871', 
    'customers/2309565764/assets/34827154141', 
    'customers/2309565764/assets/34856605170', 
    'customers/2309565764/assets/34830515300'
    ],
     
    ['customers/2309565764/assets/34830515303', 
    'customers/2309565764/assets/34830473309', 
    'customers/2309565764/assets/34830508136', 
    'customers/2309565764/assets/34830515336'], 

    ['customers/2309565764/assets/20029085042', 
    'customers/2309565764/assets/20033811553', 
    'customers/2309565764/assets/20065471524', 
    'customers/2309565764/assets/20029089104'], 

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/11111', 
    'customers/2309565764/assets/22222', 
    'customers/2309565764/assets/33333', 
],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],
    ]


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

result = []
transitional_data = []
for i in data:
    if len(transitional_data) + len(i) <= 20:
        for j in i:
            transitional_data.append(j)
    else:
        result.append(transitional_data)
        transitional_data = []
print(result)


В итоге получаю только один вложенный список, вместо 3х (два из которых будут иметь 20 элементов и один 4 остаточных)

[['customers/2309565764/assets/34830517871', 'customers/2309565764/assets/34827154141', 'customers/2309565764/assets/34856605170', 'customers/2309565764/assets/34830515300', 'customers/2309565764/assets/34830515303', 'customers/2309565764/assets/34830473309', 'customers/2309565764/assets/34830508136', 'customers/2309565764/assets/34830515336', 'customers/2309565764/assets/20029085042', 'customers/2309565764/assets/20033811553', 'customers/2309565764/assets/20065471524', 'customers/2309565764/assets/20029089104', 'customers/2309565764/assets/20033813263', 'customers/2309565764/assets/20065476771', 'customers/2309565764/assets/20029091753', 'customers/2309565764/assets/20029091369', 'customers/2309565764/assets/20033813263', 'customers/2309565764/assets/20065476771', 'customers/2309565764/assets/20029091753', 'customers/2309565764/assets/20029091369']]


Условие по вложенным спискам в data - элементы вложенного списка нельзя разделять, т.е. например первые два элемента из
['customers/2309565764/assets/34830515303', 
    'customers/2309565764/assets/34830473309', 
    'customers/2309565764/assets/34830508136', 
    'customers/2309565764/assets/34830515336'],


не могут попасть в первый подсписок, а остальные два в другой. Элементов в изначальных вложенных списках может быть <= 4.
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Lepilov Автор вопроса
def combine(original_list, maxlen=20):
    outer_list = []
    accum = []

    for sublist in original_list:
        # if the next set of values will fit, extend the sublist
        if len(accum) + len(sublist) <= maxlen:
            accum.extend(sublist)
        else:
            # otherwise start a new sublist
            outer_list.append(accum)
            accum = list(sublist)

    # pick up any values that are left over
    if accum:
        outer_list.append(accum)

    return outer_list
Ответ написан
Комментировать
lxstvayne
@lxstvayne
Люблю Python
Можно решить эту задачу используя пакет more-itertools
from itertools import chain
from more_itertools import grouper

data = [[1, 2, 3], [4, 5, 6], [6, 7, 8], [1, 2]]

res = [[el for el in group if el is not None]
       for group in grouper(chain.from_iterable(data), 4)]

# [[1, 2, 3, 4], [5, 6, 6, 7], [8, 1, 2]]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы