#python
Вопрос:
list = [ ["Eggs", "Milk", "Cheese"], [1, 2, 3, 4], ["A", "B" ] ]
newlist = []
appendThisList = []
for count in range(0, 13):
appendThisList.append(count)
if int(count) % 3 == 0:
newlist.append(appendThisList)
appendThisList.clear()
list.append(newlist)
print(list)
Выход:
[['Eggs', 'Milk', 'Cheese'], [1, 2, 3, 4], ['A', 'B'], [[], [], [], [], []]]
ожидаемый:
[['Eggs', 'Milk', 'Cheese'], [1, 2, 3, 4], ['A', 'B'], [[1,2,3], [4,5,6], [7,8,9], [1,11,12] ]
Комментарии:
1. Используйте
appendThisList = []
вместоappendThisList.clear()
.2. Когда вы удаляете список приложений, вы вызываете список, который вы добавили в новый список, и приказываете ему стереть себя.
Ответ №1:
Проблема в следующем.
if int(count) % 3 == 0:
newlist.append(appendThisList)
appendThisList.clear()
Правильный код должен быть:
from copy import copy
if int(count) % 3 == 0:
newlist.append(copy(appendThisList))
appendThisList.clear()
Пояснение: Вы всегда добавляете appendThisList
в результат один и тот же экземпляр списка. И когда вы его очищаете, он очищается везде, даже после добавления.
Доказательство:
>>> a = []
>>> b = []
>>> b.append(a)
>>> b
[[]]
>>> a.append('1')
>>> b
[['1']]
>>> a.pop()
'1'
>>> b
[[]]
>>>
Ответ №2:
Я заметил две ошибки.
Сначала вы должны начать свой диапазон с 1, в противном случае в ваш список будет добавлено 0.
Затем, как уже упоминалось @mrvol, вы очищаете список, который только что добавили. Однако вам не обязательно импортировать копию. Распаковка тоже подойдет:
list = [ ["Eggs", "Milk", "Cheese"], [1, 2, 3, 4], ["A", "B" ] ]
newlist = []
appendThisList = []
for count in range(1, 13):
appendThisList.append(count)
if int(count) % 3 == 0:
newlist = [[*appendThisList]]
appendThisList.clear()
list.append(newlist)
print(list)
Выход:
[['Eggs', 'Milk', 'Cheese'], [1, 2, 3, 4], ['A', 'B'], [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]]