Добавление элементов в двумерный массив
Хочу добавлять числа в двумерный массив в цикле, есть вот такой код:
customers = [1,3,5,7,3,7,9,67]
n = 4
if len(customers) == 0:
print(0)
elif n == 1:
print (sum(customers))
elif n >= len(customers):
print(max(customers))
else: #СОДЕРЖАТЕЛЬНАЯ ЧАСТЬ
tills = [[]]*n
j = 0
for i in range(len(customers)):
tills[j].append(customers[i])
if j < n-1:
j += 1
else:
j = 0
print(tills)
НО я не понимаю, почему вывод вот такой:
[[1, 3, 5, 7, 3, 7, 9, 67], [1, 3, 5, 7, 3, 7, 9, 67], [1, 3, 5, 7, 3, 7, 9, 67], [1, 3, 5, 7, 3, 7, 9, 67]]
По моей логике (что и нужно получить мне), должно быть вот так:
[[1,3],[3,7],[5,9],[7,67]]
Как этого добиться?
Ответы (2 шт):
Создайте список следующим образом:
customers = [1,3,5,7,3,7,9,67]
n = 4
if len(customers) == 0:
print(0)
elif n == 1:
print (sum(customers))
elif n >= len(customers):
print(max(customers))
else: #СОДЕРЖАТЕЛЬНАЯ ЧАСТЬ
tills = [[] for _ in range(n)]
j = 0
for i in range(len(customers)):
tills[j].append(customers[i])
if j < n-1:
j += 1
else:
j = 0
print(tills)
В питоне списки - это объекты, и поэтому сам язык старается максимально оптимизировать их использование через ссылки, ленивые вычисления и так далее.
Когда вы создаете список с помощью кода array = [[]] * n, то фактически вы создаете только список array[0], а все остальные списки становятся его копиями, записанными с помощью ссылки на этот созданный "нулевой" список.
Поэтому добавляя элементы в любой из списков, вы фактически добавляете эти элементы в array[0], а в остальных списках они появляются потому, что все остальные списки являются ссылками на array[0].
Для того, чтобы исправить данную ошибку, можно использовать генераторы списков:
array = [[] for _ in range(n)]