Python3 中嵌套 for 循环的替代方法

Alternative to nested for loops in Python3

我有一段代码可以比较学生的技能水平和作业的难度水平。它试图将学生的水平与可能的最高作业难度相匹配。我使用两个嵌套的 for 循环取得了成功。但是,当值的数量增加时,它的效率非常低。

    def maxAssignmentPoints(self, difficulty, points, student) -> int:
        global totalPoints
        totalPoints = 0
        for i in range(len(student)):
            for j in range(len(difficulty)):
                if student[i] > difficulty[j]:
                    try:
                        if student[i] < difficulty[j + 1]:
                            totalPoints += points[j]
                    except IndexError:
                        break
                if student[i] == difficulty[j]:
                    totalPoints += points[j]
        return str(totalPoints)

我也研究过使用 itertools.product 但我不确定如何比较笛卡尔积中的两个变量。 results = list(product(student, difficulty)) 产生 (1,1) (1,2) (1,3) (2,1)... 等等。有什么方法可以比较这对中的值吗?

你写:"However, it is incredibly inefficient when the number of values increases." 为什么?数据越多,处理它所花费的时间就越多。我不认为嵌套循环对于函数的性能来说是一个“令人难以置信”的问题。使用最合适的数据结构及其处理算法可以提高性能。

至于你的函数,可以改写成更易读的形式:

def max_assignment_points(difficulties: list, points: list, students: list) -> int:
    total_points = 0
    for student in students:
        for i in range(len(difficulties) - 1):
            if difficulties[i] < student < difficulties[i + 1]:
                total_points += points[i]
            elif student == difficulties[i]:
                total_points += points[i]
    return total_points

P.S.

首先,在函数内部使用 global 变量并同时更改它是个坏主意。是什么阻止您声明局部变量?

其次,在声明一个函数的时候,你写的是returns一个int值,但实际上它returns一个str.

第三,使用异常跳出循环似乎很奇怪。

我不认为更多的循环在这里是不好的,但是高效的数据结构会派上用场。您可以在字典中保留难度范围 - 格式为:

scores = dict(zip(difficulty, points))

现在感觉比以前更有条理了。

def maxAssignmentPoints(self, students, scores) -> int:
    totalPoints = 0
    for student in range(students):
        if scores.get(student, None) is not None:
            total_points += scores[student]
    return str(totalPoints)

如果有帮助请告诉我。