Как я могу инициализировать список подсписков подсписков из одномерного списка или массива? - PullRequest
1 голос
/ 13 апреля 2020

У меня есть функция, которая создает список списков списков:

def initialize_master_list(n, h, o):
    master_list = []
    master_list.append([[0 for i in range(n+1)] for j in range(h)])
    master_list.append([[0 for i in range(h+1)] for j in range(o)])
    return master_list

Это создает список 2 списков, где первым является список h списков длины n+1 а второй список o списков длиной h+1. Эта функция инициализирует каждый из элементов самого глубокого списка как 0. Здесь я напечатал, как выглядит список:

N, H, O = 4, 3, 2
ML = initialize_master_list(N, H, O)
print(ML)

[[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0]]]

Вместо 0 я хочу инициализировать эти значения как поступающие из одномерного списка или массив значений. Этот одномерный список имеет длину (h * n+1) + (o * h+1). Для текущего примера длина составляет (3 * 5) + (2 * 4) = 15 + 8 = 23.

Например:

GRAB = [round(random.uniform(1, 9),1) for _ in range((H*(N+1))+(O*(H+1)))]
print(GRAB)

[7.4, 5.7, 5.3, 7.1, 2.7, 4.3, 4.1, 7.0, 1.4, 1.4, 2.2, 3.2, 1.6, 8.4, 5.7, 2.0, 4.5, 7.8, 4.1, 5.1, 1.5, 1.6, 1.7]

Как я могу инициализировать ML, используя эти значения, вместо этого?

Мой ожидаемый вывод может быть:

ML = initialize_master_list(N, H, O, GRAB)
print(ML)

[[[7.4, 5.7, 5.3, 7.1, 2.7], [4.3, 4.1, 7.0, 1.4, 1.4], [2.2, 3.2, 1.6, 8.4, 5.7]], [[2.0, 4.5, 7.8, 4.1], [5.1, 1.5, 1.6, 1.7]]]

Как я могу инициализировать эту структуру списка на основе N, H, O? Те значения, которые я выбрал произвольно, они могут быть любыми, но я могу предположить, что GRAB будет точным числом чисел, с которого я хочу инициализировать список.

Моя лучшая идея состояла в том, чтобы создать генератор и получить значения (вместо 0 for i in range... в initialize_master_list, это будет next(generator) for i in range..., но это безобразно. Я надеюсь, что есть более простой способ, который не объединяет все вместе.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Создайте итератор, используя iter и используйте next для извлечения каждого значения в следующем порядке:

def initialize_master_list(n, h, o, g):
    it = iter(g)
    master_list = [[[next(it) for i in range(n + 1)] for j in range(h)],
                   [[next(it) for i in range(h + 1)] for j in range(o)]]
    return master_list


N, H, O = 4, 3, 2
GRAB = [7.4, 5.7, 5.3, 7.1, 2.7, 4.3, 4.1, 7.0, 1.4, 1.4, 2.2,
        3.2, 1.6, 8.4, 5.7, 2.0, 4.5, 7.8, 4.1, 5.1, 1.5, 1.6, 1.7]

result = initialize_master_list(N, H, O, GRAB)

print(result)

Выход

[[[7.4, 5.7, 5.3, 7.1, 2.7], [4.3, 4.1, 7.0, 1.4, 1.4], [2.2, 3.2, 1.6, 8.4, 5.7]], [[2.0, 4.5, 7.8, 4.1], [5.1, 1.5, 1.6, 1.7]]]
1 голос
/ 13 апреля 2020

Вы можете создать генератор, заполненный списком значений, и использовать его для заполнения ваших списков списков:

def initialize_master_list(n, h, o, l):
    master_list = []
    seeds = val_generator(l)
    master_list.append([[next(seeds) for i in range(n+1)] for j in range(h)])
    master_list.append([[next(seeds) for i in range(h+1)] for j in range(o)])
    return master_list

def val_generator(l):
    for val in l:
        yield val

Этот подход может быть желателен, если вам нужны какие-либо пользовательские логики c как часть ваш генератор.

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