2009-06-09 17 views
24

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

38

Numpy kullanıyorsunuz. Numpy ile sadece yapabilirsiniz:

şuna ne dersiniz
for cell in self.cells.flat: 
    do_somethin(cell) 
+1

Sanırım şimdi ['numpy.nditer()'] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html) – tuned

13

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.

+1

Benim için çalışıyor. Olması gereken: hücre için [hücre içinde satır için self.cells hücre]: do_something (hücre) – xApple

+0

Vay, bu cevap antik. Haklısın; düzeltecek. – Eevee

+0

Yaptığı şey iyi değil mi? Liste kavraması yerine sadece bir jeneratör ifadesi ... Bir şeyi özlüyorum mu? O.o –

4

:

import itertools 
for cell in itertools.chain(*self.cells): 
    cell.drawCell(surface, posx, posy) 
+0

'ile bunu yapmanın daha etkili bir yolu var. itertools.chain.from_iterable (self.cells) ' – jfs

26

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 
6

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 .

2

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