【问题标题】:Alternative to nesting for loops in Python在 Python 中嵌套 for 循环的替代方法
【发布时间】:2023-02-05 21:22:20
【问题描述】:

我读过 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 个嵌套循环)。其次,如果嵌套太多,编写这段代码的另一种方法是什么?

【问题讨论】:

  • 你在这里寻找itertools.product
  • 您确定您的返回语句在 2 个 for 循环内吗?
  • 0xc0de,打错了(我的意思是打印),谢谢你指出
  • @AshwiniChaudhary 你确定你的 return 语句在 2 个 for 循环中吗?

标签: python for-loop nested-loops


【解决方案1】:
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

【讨论】:

  • 我会使用 xrange 而不是 range。我也同意循环内的 return 是一个错误。
  • @Balthamos,对于小范围,range 更快,Python3 中没有xrange。 OP 没有提及他们使用的是哪个版本
  • 您可以将回报贴在总和计算行上。正如您正确指出的那样, return 将停止执行并执行调用后的下一条语句。由于不需要my_sum变量(返回调用后不能使用),所以不需要声明。简而言之,return 1 + sum(int(n) for n in grid[x][y: y + 4])
  • @BurhanKhalid,OP 澄清说它应该只是一个print
  • 啊好吧。不建议将方法中的内容打印为最终结果。这会导致该方法返回 None 并且如果您返回 print horizontal() 会感到惊讶
【解决方案2】:
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]

【讨论】:

    【解决方案3】:

    您可以使用字典来显着优化性能

    这是另一个例子:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2020-01-15
      • 2021-05-25
      • 2022-12-31
      • 2012-04-15
      相关资源
      最近更新 更多