2012-12-17 63 views
3

我讀過Python的一個關鍵信念,那就是flat> nested。但是,如果我有幾個變量計數,多個for循環的替代方法是什麼? 我的代碼是用於計數網格和以及去如下:Python中嵌套循環的替代方案

def horizontal(): 
    for x in range(20): 
     for y in range(17): 
      temp = grid[x][y: y + 4] 
      sum = 0 
      for n in temp: 
       sum += int(n) 
      print sum # EDIT: the return instead of print was a mistype 

這在我看來就像是過重嵌套。首先,Python中的許多嵌套循環被認爲是什麼(我之前肯定見過2個嵌套循環)。其次,如果嵌套過於嚴重,那麼編寫此代碼的另一種方法是什麼?

+0

您正在尋找['itertools.product'](http://docs.pyth on.org/2/library/itertools.html#itertools.product)。 –

+4

你確定你的return語句在循環內部嗎? – 0xc0de

+0

0xc0de,這是錯誤的(我的意思是打印),謝謝你指出它 – davenz

回答

7
from itertools import product 

def horizontal(): 
    for x, y in product(range(20), range(17)): 
     print 1 + sum(int(n) for n in grid[x][y: y + 4]) 

您應該使用sum函數。當然也可以不是如果你具有可變陰影,所以我改成my_sum

+0

我相信你在'20'後面錯過了一個正確的表情。 – recursive

+0

@recursive,謝謝修復 –

+0

我會使用'xrange'而不是'range'。我也同意循環內的'return'是一個錯誤。 – Balthamos

1
grid = [range(20) for i in range(20)] 
sum(sum(1 + sum(grid[x][y: y + 4]) for y in range(17)) for x in range(20)) 

上述輸出13260,對於代碼的第一行所產生的特定網格。它使用sum()三次。最裏面的總和將grid[x][y: y + 4]中的數字相加,再加上問題中代碼中顯示的稍微奇怪的初始值sum = 1。中間總和爲17個可能的y值加上這些值。外部和將可能的x值的中間值相加。

如果電網的元素是字符串而非數字,更換
sum(grid[x][y: y + 4])

sum(int(n) for n in grid[x][y: y + 4]

0

您可以使用字典來優化性能顯著

這是另一個例子:

locations = {} 
for i in range(len(airports)): 
    locations[airports["abb"][i][1:-1]] = (airports["height"][i], airports["width"][i]) 

for i in range(len(uniqueData)): 
    h, w = locations[uniqueData["dept_apt"][i]] 
    uniqueData["dept_apt_height"][i] = h 
    uniqueData["dept_apt_width"][i] = w