Создание вложенного списка внутри вложенного списка в python - PullRequest
1 голос
/ 12 июля 2020

У меня есть этот вложенный список:

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

Количество элементов подсписка всегда кратно 3. Я хочу иметь 3 элемента в каждом подсписке. Желаемый результат:

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

Я могу добиться этого, но сначала мне нужно сгладить список, а затем создать вложенный список. Мой код:

list_1 = [values for sub_list in lists_1 for values in sub_list]  # flatten it first

list_1 = [list_1[i:i+3] for i in range(0, len(list_1), 3)]

Есть ли способ пропустить этап сглаживания и получить желаемый результат?

Ответы [ 3 ]

3 голосов
/ 12 июля 2020

Вы можете использовать вложенный список:

list_1 = [[1,2,3], [1,2,3,4,5,6], [1,2,3,4,5,6,7,8,9]]
result = [i[j:j+3] for i in list_1 for j in range(0, len(i), 3)]

Вывод:

[[1, 2, 3], [1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6], [7, 8, 9]]
0 голосов
/ 13 июля 2020

Чтобы вставить мои два цента, вы можете использовать две функции генератора, одну, которая сглаживает список (с произвольно вложенным списком), и другую, которая дает пары из n значений:

def recursive_yield(my_list):
    for item in my_list:
        if isinstance(item, list):
            yield from recursive_yield(item)
        else:
            yield item

def taken(gen, number = 3):
    buffer = []
    for item in gen:
        if len(buffer) < number:
            buffer.append(item)
        else:
            yield buffer
            buffer = []
            buffer.append(item)
    if buffer:
        yield buffer
    
result = [x for x in taken(recursive_yield(list_1))]

Вот некоторые примеры входов / выходов:

list_1 = [[1,2,3], [1,2,3,4,5,6], [1,2,3,4,5,6,7,8,9]]
# -> [[1, 2, 3], [1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6], [7, 8, 9]]

list_1 = [1,2,3,4,5,6]
# -> [[1, 2, 3], [4, 5, 6]]

list_1 = [1,2,[[1,2,4,5], [[[[1,10,9]]]]]]
# -> number = 5
# -> [[1, 2, 1, 2, 4], [5, 1, 10, 9]]

Таким образом, решение гораздо более гибкое, чем только нарезка.

0 голосов
/ 12 июля 2020

Вот как вы можете использовать вложенные списки:

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

list_1 = [a for b in list_1 for a in b]
list_1 = [list_1[i:i+3] for i in range(0,len(list_1),3)]

print(list_1)

Вывод:

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