我已经读到Python的一个关键信念是flat>嵌套。但是,如果我有几个变量计数,多个for循环的替代方法是什么? 我的代码用于计算网格总和,如下所示:
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 :(得分:10)
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
答案 1 :(得分: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]
答案 2 :(得分: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