как динамически добавлять в список

#python

#python

Вопрос:

Я пытаюсь создать сложный список на python с общей структурой, описанной следующим образом.

Внешний список представляет собой обычный список вида [index1, index2, index3, ...]

и каждый индекс в списке имеет следующую структуру:

 [a, b, [[c, d], [e, f], [g, h], ...]
 

Предполагается, что значения c, d, e, f, etc должны соответствовать значениям a and b и должны быть уникальными для индекса, поэтому повторения не должно быть, если a and b они не повторяются.

Код, который я должен попытаться реализовать, это:

 a = []
b = []

for i in range(4):
    a.append([i,i])
    b.clear()
    for j in range(6):
        b.append([i,j])
    a[i].append(b)
 

И результат, который я получаю при печати каждого индекса:

 [0, 0, [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5]]]
[1, 1, [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5]]]
[2, 2, [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5]]]
[3, 3, [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5]]]
 

Как уже отмечалось, выходные данные содержат только данные из конечного индекса. Я могу сказать, что b.clear() причиной этого является, но я думаю, что, поскольку я добавляю к a перед очисткой данных предыдущего индекса, это не вызовет такого поведения.

Комментарии:

1. Как вы можете определить, b.clear() почему выходные данные содержат только данные из конечного индекса?

2. вам нужно создать копию списка, используя b.copy() while appending to a . попробуйте с a[i].append(b.copy())

3. Создание копии сработало. Спасибо!

Ответ №1:

Проблема не clear в том, что это обязательно вызывает проблему, а в том, что вы повторно используете массив b , объявленный на том же уровне, a что и . Перемещение инициализации b в цикл (и даже сохранение clear ) дает вам поведение, которое вы ожидали.

 a = []

for i in range(4):
    a.append([i, i])
    b = []
    b.clear()
    for j in range(6):
        b.append([i, j])
    a[i].append(b)
 

Вывод

 [0, 0, [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5]]]
[1, 1, [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]]
[2, 2, [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5]]]
[3, 3, [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5]]]