yılında çok boyutlu bir dizi aracılığıyla böyle Python çok boyutlu bir dizi oluşturduk. Bunu nasıl başarabilirim?yineleme Python
cevap
Numpy kullanıyorsunuz. Numpy ile sadece yapabilirsiniz:
şuna ne dersinizfor cell in self.cells.flat:
do_somethin(cell)
Sadece bir boyutun üzerinde, ardından diğerinde yineleyin. Sadece iki boyutlarıyla, bir list comprehension veya jeneratör ifadesini kullanarak tek döngü bu aşağı sıkıştırabilir, ama bu çok ölçeklenebilir veya okunabilir değil Tabii
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)
Eğer gerekiyorsa Bunu birden çok boyuta ölçeklendirin ve gerçekten bir düz liste isteyin, write a flatten
function.
:
import itertools
for cell in itertools.chain(*self.cells):
cell.drawCell(surface, posx, posy)
'ile bunu yapmanın daha etkili bir yolu var. itertools.chain.from_iterable (self.cells) ' – jfs
Eğer arkadaşın (Numpy olarak) daha sonra ndenumerate bireysel hücrelerin değerlerini değiştirmek gerekiyorsa. Yapmasanız bile muhtemelen hala var!
for index,value in ndenumerate(self.cells):
do_something(value)
self.cells[index] = new_value
her bir öğenin dizinini yanı sıra komutunu numaralandırmak kullanarak elemanı kendisi alabilirsiniz:
i
for (i,row) in enumerate(cells):
for (j,value) in enumerate(row):
print i,j,value
,
j
elementi ve
value
satır ve sütun dizin içermesi eleman kendisi olduğu .
kimse Numpy olmadan formu keyfi fazla boyut çalışacak bir cevabı var, bu yüzden buraya çok iyi bir hata kontrol yok
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
# ..
Bu kullandım bir özyinelemeli çözüm koyacağım ama
Sanırım şimdi ['numpy.nditer()'] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html) – tuned