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)
如果有帮助请告诉我。
我有一段代码可以比较学生的技能水平和作业的难度水平。它试图将学生的水平与可能的最高作业难度相匹配。我使用两个嵌套的 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)
如果有帮助请告诉我。