Есть ли способ в 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]]
Ответ 11
Вы можете использовать N-мерный массив (ndarray). Вот ссылка на документацию. http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html