社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Programmer • 3 年前 • 1269 次点击  

我有这个密码:

#!/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
 
1269 次点击  
文章 [ 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() 在这个循环中,它在每次迭代时从头开始重新计算总和,这不是很有效。