Инициализация многомерного массива Python без цикла

Есть ли способ в Python инициализировать многомерный массив/список без использования цикла?

Ответ 1

Конечно, есть способ

arr = eval(`[[0]*5]*10`)

или

arr = eval(("[[0]*5]+"*10)[:-1])

но это ужасно и расточительно, поэтому все используют циклы (обычно перечисляют) или numpy

Ответ 2

В зависимости от ваших реальных потребностей де-факто "стандартный" пакет Numpy может предоставить вам именно то, что вам нужно.

Вы можете, например, создать многомерный массив с

numpy.empty((10, 4, 100))  # 3D array

(инициализируется произвольными значениями) или создайте те же массивы с нулями всюду с

numpy.zeros((10, 4, 100))

Numpy очень быстрый, для операций с массивами.

Ответ 3

Конечно, вы можете просто сделать

mylist = [
            [1,2,3],
            [4,5,6],
            [7,8,9]
         ]

Ответ 4

Я не верю, что это возможно.

Вы можете сделать что-то вроде этого:

>>> a = [[0] * 5] * 5

чтобы создать матрицу 5x5, но это повторяющиеся объекты (которые вам не нужны). Например:

>>> a[1][2] = 1
[[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]]

Вам почти наверняка нужно использовать какой-то цикл, как в:

[[0 for y in range(5)] for x in range(5)]

Ответ 5

Рекурсия - ваш друг: D

Это довольно наивная реализация, но она работает!

dim = [2, 2, 2]

def get_array(level, dimension):
    if( level != len(dimension) ):
        return [get_array(level+1, dimension) for i in range(dimension[level])]
    else:
        return 0

print get_array(0, dim)

Ответ 6

Ниже не используется специальная библиотека, а не eval:

arr = [[0]*5 for x in range(6)]

и не создает повторяющихся ссылок:

>>> arr[1][1] = 2
>>> arr
[[0, 0, 0, 0, 0],
 [0, 2, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]]

Ответ 7

Это зависит от того, что вам нужно инициализировать массив, но обязательно. Вы можете использовать представление списка для создания массива 5 и times; 3, например:

>>> [[0 for x in range(3)] for y in range(5)]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

>>> [[3*y+x for x in range(3)] for y in range(5)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]

Да, я полагаю, у этого все еще есть петли &mdash, но все это делается в одной строке, которая, как я полагаю, является предполагаемым значением вашего вопроса?

Ответ 8

Если вы выполняете численную работу с помощью Numpy, что-то вроде

x = numpy.zeros ((m,n))
x = numpy.ones ((m,n))

Ответ 9

У Python нет массивов. Он имеет другие типы последовательностей, начиная от списков и заканчивая словарями, не забывая о наборах - правильный зависит от ваших конкретных потребностей.

Предполагая, что ваш "массив" на самом деле является списком, а "initialize" означает выделение списка списков элементов NxM, вы можете (псевдокод):

  • для N раз: для M раз: добавьте элемент
  • для N раз: добавьте строку из M элементов
  • напишите все это

Вы говорите, что не хотите зацикливаться, и это исключает первые два пункта, но почему? Вы также говорите, что не хотите писать вещь вниз (в ответ на JacobM), так как бы вы это сделали? Я не знаю ни о каком другом способе получения структуры данных, не генерируя ее в меньших частях (цикл) или явно записывая ее - на любом языке программирования.

Также имейте в виду, что инициализированный, но пустой список не лучше, чем никакой список, если вы не поместили в него данные. И вам не нужно инициализировать его перед помещением данных...

Если это не теоретическое упражнение, вы, вероятно, задаете неправильный вопрос. Я предлагаю вам объяснить, что вам нужно сделать с этим массивом.

Ответ 10

a = [[]]
a.append([1,2])
a.append([2,3])

Тогда

>>> a
[[1, 2], [2, 3]]