5

我读过 Python 的关键信念之一是平面 > 嵌套。但是,如果我有多个变量计数,那么多个 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 个嵌套循环)。其次,如果这嵌套太重,编写此代码的替代方法是什么?

4

3 回答 3

13
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

于 2012-12-17T05:02:48.443 回答
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]

于 2012-12-17T05:10:28.643 回答
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
于 2016-10-12T09:08:07.327 回答