Py学习  »  Python

如何将这些重复的if语句转换为python中的单个循环?

Programmer • 3 年前 • 1458 次点击  

我有这个密码:

#!/usr/bin/python3

def contract(e, i, c, n):
        l = len(e)
        grid = [[0 for i in range(i + 1)] for x in range(l)]

        for num1, row1 in enumerate(grid):
                row1[0] = e[num1] #add exponents

        for num2, row2 in enumerate(grid):
                if 0 <= num2 < n[0]:
                        grid[num2][1] = c[num2]
                if n[0] <= num2 < n[0] + n[1]:
                        grid[num2][2] = c[num2]
                if n[0] + n[1] <= num2 < n[0] + n[1] + n[2]:
                        grid[num2][3] = c[num2]

        for g in grid:
                print(g)

e = [0, 1, 2, 3]
i = 3
c = [4, 5, 6, 7]
n = [1, 2, 1]

contract(e, i, c, n)

这段代码的想法是,我有一个二维网格 len(e) x (i + 1) e 。其余列应包含系数 c 以这样的方式 n 确定系数在栅格中的位置。例如,自从 n[0] = 1 ,第1列,网格中的第0行包含数字4。下一个元素 N 是2,所以网格中的下一列(第2列)应该包含2个数字,这意味着我之前使用的行下面的行中有数字5和6(这意味着已经使用了第1行和第2行,因为已经使用了第0行)。 n[2] = 1 所以 grid[3][3] = 7

我用重复的if语句实现了这一点,代码运行良好,输出结果如下:

[0, 4, 0, 0]
[1, 0, 5, 0]
[2, 0, 6, 0]
[3, 0, 0, 7]

然而,我想制作一个通用代码,可以对任意数量的系数和指数执行此操作。如何将这些重复的if语句转换为单个循环?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130972
 
1458 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Barmar
Reply   •   1 楼
Barmar    3 年前

使用一个循环,对图像的连续切片求和 n 列表

for num2, row2 in enumerate(grid):
    for idx in range(len(n)):
        if sum(n[:idx]) <= num2 < sum(n[:idx+1]):
            grid[num2][idx+1] = c[num2]

这是您编写的代码到循环的直接映射,如果 N 不会变得太大。BrokenBenchmark的答案经过优化,以利用每个片段的总和是前一个片段加上当前元素的总和这一事实。

BrokenBenchmark
Reply   •   2 楼
BrokenBenchmark    3 年前

我会把它变成一个 for 循环,跟踪到目前为止看到的元素的总和,如果不等式适用于该迭代,则调整相应的元素:

for num2, row2 in enumerate(grid):
    total = 0
    for n_idx, n_elem in enumerate(n):
        if total <= num2 < total + n_elem:
            grid[num2][n_idx + 1] = c[num2]
        total += n_elem

我建议不要使用 sum() 在这个循环中,它在每次迭代时从头开始重新计算总和,这不是很有效。