TransWikia.com

Добавление элементов в двумерный массив

Stack Overflow на русском Asked by daria k on December 11, 2021

Хочу добавлять числа в двумерный массив в цикле, есть вот такой код:

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 Answers

В питоне списки - это объекты, и поэтому сам язык старается максимально оптимизировать их использование через ссылки, ленивые вычисления и так далее.

Когда вы создаете список с помощью кода array = [[]] * n, то фактически вы создаете только список array[0], а все остальные списки становятся его копиями, записанными с помощью ссылки на этот созданный "нулевой" список.

Поэтому добавляя элементы в любой из списков, вы фактически добавляете эти элементы в array[0], а в остальных списках они появляются потому, что все остальные списки являются ссылками на array[0].

Для того, чтобы исправить данную ошибку, можно использовать генераторы списков:

array = [[] for _ in range(n)]

Answered by EzikBro on December 11, 2021

Создайте список следующим образом:

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)

Answered by dIm0n on December 11, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP