Я создал многомерный массив в Python следующим образом:
self.cells = np.empty((r,c),dtype=np.object)
Теперь я хочу перебрать все элементы моего двухмерного массива, и мне не нужен порядок. Как достичь этого?
Я создал многомерный массив в Python следующим образом:
self.cells = np.empty((r,c),dtype=np.object)
Теперь я хочу перебрать все элементы моего двухмерного массива, и мне не нужен порядок. Как достичь этого?
Ясно, что вы используете numpy. С numpy вы можете просто сделать:
for cell in self.cells.flat:
do_somethin(cell)
Если вам нужно изменить значения отдельных ячеек, то ndenumerate (в numpy) является вашим другом. Даже если вы этого не сделаете, возможно, все еще есть!
for index,value in ndenumerate( self.cells ):
do_something( value )
self.cells[index] = new_value
Просто перебирайте одно измерение, затем другое.
for row in self.cells:
for cell in row:
do_something(cell)
Конечно, только с двумя измерениями вы можете сжать это до одного цикла, используя понимание списка или выражение генератора, но это не очень масштабируемый или читаемый:
for cell in (cell for row in self.cells for cell in row):
do_something(cell)
Если вам нужно масштабировать это до нескольких измерений и действительно хотите иметь плоский список, вы можете написать функцию flatten
.
Как насчет этого:
import itertools
for cell in itertools.chain(*self.cells):
cell.drawCell(surface, posx, posy)
вы можете получить индекс каждого элемента, а также сам элемент, используя команду перечисления:
for (i,row) in enumerate(cells):
for (j,value) in enumerate(row):
print i,j,value
i
, j
содержат индекс строки и столбца элемента, а value
- сам элемент.
Никто не имеет ответа, который будет работать произвольно во многих измерениях без numpy, поэтому я поставлю здесь рекурсивное решение, которое я использовал
def iterThrough(lists):
if not hasattr(lists[0], '__iter__'):
for val in lists:
yield val
else:
for l in lists:
for val in iterThrough(l):
yield val
for val in iterThrough(
[[[111,112,113],[121,122,123],[131,132,133]],
[[211,212,213],[221,222,223],[231,232,233]],
[[311,312,313],[321,322,323],[331,332,333]]]):
print(val)
# 111
# 112
# 113
# 121
# ..
Это не очень хорошая проверка ошибок, но она работает для меня