Как инициализировать двумерный массив в Python?

Я начинаю питон, и я пытаюсь использовать двумерный список, который я изначально заполняю одной переменной во всех местах. Я придумал это:

def initialize_twodlist(foo): twod_list = [] new = [] for i in range (0, 10): for j in range (0, 10): new.append(foo) twod_list.append(new) new = [] 

Он дает желаемый результат, но выглядит как обходной путь. Есть ли более простой / более короткий / более элегантный способ сделать это?

  • Как векторным образом найти уникальные векторы массива 2d над определенной осью?
  • Чтение файла в многомерный массив с помощью Python
  • Numpy: среднее значение по одному измерению в «зубчатой» 3D-массиве
  • Реорганизация MxN 2D-массива данных в N-мерный массив
  • Pythonic способ печати 2D-списка - Python
  • Вращение двумерного массива в Python
  • Матрица Transpose в Python
  • как искать уникальные элементы в первом столбце многомерного массива
  • 14 Solutions collect form web for “Как инициализировать двумерный массив в Python?”

    Шаблон, который часто возникал на Python, был

     bar = [] for item in some_iterable: bar.append(SOME EXPRESSION) 

    которые помогли мотивировать введение перечня, которые преобразуют этот фрагмент в

     bar = [SOME EXPRESSION for item in some_iterable] 

    который короче, а иногда и яснее. Обычно вы привыкли распознавать эти и часто заменяя петли пониманием.

    Ваш код следует за этим шаблоном дважды

     twod_list = [] \ for i in range (0, 10): \ new = [] \ can be replaced } this too for j in range (0, 10): } with a list / new.append(foo) / comprehension / twod_list.append(new) / 

    Вы можете использовать понимание списка :

     x = [[foo for i in range(10)] for j in range(10)] # x is now a 10x10 array of 'foo' (which can depend on i and j if you want) 

    Этот способ выполняется быстрее, чем вложенные списки

     [x[:] for x in [[foo] * 10] * 10] # for immutable foo! 

    Вот несколько таймингов python3, для небольших и больших списков

     $python3 -m timeit '[x[:] for x in [[1] * 10] * 10]' 1000000 loops, best of 3: 1.55 usec per loop $ python3 -m timeit '[[1 for i in range(10)] for j in range(10)]' 100000 loops, best of 3: 6.44 usec per loop $ python3 -m timeit '[x[:] for x in [[1] * 1000] * 1000]' 100 loops, best of 3: 5.5 msec per loop $ python3 -m timeit '[[1 for i in range(1000)] for j in range(1000)]' 10 loops, best of 3: 27 msec per loop 

    Объяснение:

    [[foo]*10]*10 создает список того же объекта, который повторяется 10 раз. Вы не можете просто использовать это, потому что изменение одного элемента будет изменять тот же самый элемент в каждой строке!

    x[:] эквивалентно list(X) но немного эффективнее, так как он избегает поиска имени. В любом случае, он создает неглубокую копию каждой строки, поэтому теперь все элементы независимы.

    Все элементы – это один и тот же объект foo , поэтому, если foo изменен , вы не можете использовать эту схему. Вам нужно будет использовать

     import copy [[copy.deepcopy(foo) for x in range(10)] for y in range(10)] 

    или предполагая класс (или функцию) Foo который возвращает foo s

     [[Foo() for x in range(10)] for y in range(10)] 

    Чтобы инициализировать двумерный массив в Python:

     a = [[0 for x in range(columns)] for y in range(rows)] 
     [[foo for x in xrange(10)] for y in xrange(10)] 

    Обычно, когда вам нужны многомерные массивы, вам не нужен список списков, а скорее массив с несколькими числами или, возможно, dict.

    Например, с numpy вы бы сделали что-то вроде

     import numpy a = numpy.empty((10, 10)) a.fill(foo) 

    Вы можете сделать следующее:

     [[element] * numcols] * numrows 

    Например:

     >>> [['a'] *3] * 2 [['a', 'a', 'a'], ['a', 'a', 'a']] 

    Но это имеет побочный эффект:

     >>> b = [['a']*3]*3 >>> b [['a', 'a', 'a'], ['a', 'a', 'a'], ['a', 'a', 'a']] >>> b[1][1] 'a' >>> b[1][1] = 'b' >>> b [['a', 'b', 'a'], ['a', 'b', 'a'], ['a', 'b', 'a']] 

    Не используйте [[v] * n] * n, это ловушка!

     >>> a = [[0]*3]*3 >>> a [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> a[0][0]=1 >>> a [[1, 0, 0], [1, 0, 0], [1, 0, 0]] 

    Если это малонаселенный массив, вам может быть лучше использовать словарь с ключом с кортежем:

     dict = {} key = (a,b) dict[key] = value ... 

    используйте простейшие мысли, чтобы создать это.

     wtod_list = [] 

    и добавьте размер:

     wtod_list = [[0 for x in xrange(10))] for x in xrange(10)] 

    или если мы хотим сначала объявить размер. мы используем только:

      wtod_list = [[0 for x in xrange(10))] for x in xrange(10)] 

    Как указывали @Arnab и @Mike, массив не является списком. Немногие различия: 1) массивы фиксированного размера во время инициализации 2) массивы обычно поддерживают меньшие операции, чем список.

    Возможно, избыточный уровень в большинстве случаев, но вот базовая реализация массива 2d, которая использует реализацию аппаратного массива с использованием cythips python (c-библиотеки)

     import ctypes class Array: def __init__(self,size,foo): #foo is the initial value self._size = size ArrayType = ctypes.py_object * size self._array = ArrayType() for i in range(size): self._array[i] = foo def __getitem__(self,index): return self._array[index] def __setitem__(self,index,value): self._array[index] = value def __len__(self): return self._size class TwoDArray: def __init__(self,columns,rows,foo): self._2dArray = Array(rows,foo) for i in range(rows): self._2dArray[i] = Array(columns,foo) def numRows(self): return len(self._2dArray) def numCols(self): return len((self._2dArray)[0]) def __getitem__(self,indexTuple): row = indexTuple[0] col = indexTuple[1] assert row >= 0 and row < self.numRows() \ and col >=0 and col < self.numCols(),\ "Array script out of range" return ((self._2dArray)[row])[col] if(__name__ == "__main__"): twodArray = TwoDArray(4,5,5)#sample input print(twodArray[2,3]) 

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

     def initialize_twodlist(value): list=[] for row in range(10): list.append([value]*10) return list 

    Вот более простой способ:

     import numpy as np twoD = np.array([[]*m]*n) 

    Для инициализации всех ячеек с любым значением «x» используйте:

     twoD = np.array([[x]*m]*n 
     Matrix={} for i in range(0,3): for j in range(0,3): Matrix[i,j] = raw_input("Enter the matrix:") 
    Python - лучший язык программирования в мире.