Python中如何调试列表生成式以解决特定数值计算问题?
def removNb(n): result = [] for a in range(1, n+1): for b in range(1, n+1): if sum(range(1, n+1))-(a+b)==a*b: result.append((a,b)) return result
我把这段代码用列表生成式表达为 def removNb(n): return [(a,b) for a,b in range(1,n+1) if sum(range(1,n+1))-(a+b)==a*b] 得到的错误提示是:TypeError: 'int' object is not iterable 不知道哪里写错了?
Python中如何调试列表生成式以解决特定数值计算问题?
调试列表生成式,特别是涉及复杂数值计算时,直接打印中间状态比较麻烦。我常用的方法是把它临时展开成for循环,这样就能在每一步插入print或使用调试器。
比如,你原来可能有个这样的生成式:
result = [some_func(x) for x in iterable if condition(x)]
可以先改成这样来调试:
result = []
for x in iterable:
if condition(x):
print(f"Processing x={x}") # 看这里
val = some_func(x)
print(f"Result: {val}") # 看这里
result.append(val)
这样你能清楚地看到每个被处理的x和对应的计算结果。如果问题出在some_func内部,那就再单独深入调试这个函数。调试完确认逻辑正确后,如果愿意可以再改回生成式。
总结:把生成式展开成循环来逐步检查。
不小心发出去了,range 返回一个 int,你这里对一个 int 拆包成 a,b 两个变量,所以提示你 int 无法遍历
那么必须用 2 层循环?[(a,b) for a in range(1,n+1) for b in range(1,n+1) if sum(range(1,n+1))-(a+b)==a*b]
是的,太谢谢了
lambda n: [a for a in range(int(n/2), n+1) if int((nn + n + 2)/2/(a+1)) == (nn + n + 2)/2/(a+1)]
问题简化出来就是一个多元一次方程求可能解的问题,使用等差数列求和公式省掉不必要的循环
我提供一个我的思路:
1、生成 1~n 排列组合 list。 形式如[(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)]
2、if 条件判断 排列组合列表内 tuple 元素 a,b 的乘积与总和减 a,b 是否相等,相等则返回
3、使用内建 filter 函数获得结果
=====filter 函数=====
filter(function, sequence):
对 sequence 中的 item 依次执行 function(item),将执行结果为 True 的 item 组成一个 List/String/Tuple (取决于 sequence 的类型)返回
====用到两个东西==
1、python 内置的可重复排列组合函数 combinations_with_replacement()
2、1 至 n 总和 使用等差数列求和公式 Sn = na1 + n (n – 1)d/2 ( n 为项数,a1 为第一个数,d 为公差)
===公式补充说明===
等差数列求和公式:Sn = na1 + n* (n – 1)d/2
n 为项数,d 为公差,在题主场景里由于是从 1 开始以 1 递增,且公差为 1,公式可以简化为:
Sn = n + n (n – 1)/2
=======实现======python3<br>from itertools import combinations_with_replacement<br><br>def findPossible(n):<br> sn = range(1,n+1) #生成等差数列<br> combList = list(combinations_with_replacement(sn,2)) #生成排列组合列表<br><br> result = filter(lambda item: equationJudge(n, sn,item), combList) #对 combList 进行逐项 filter<br> return list(result)<br><br>def equationJudge(n, sn, t):<br> snLength = len(sn)<br> if t[0]*t[1] == snLength + snLength * ( n - 1 ) / 2 - t[0] - t[1]: #套用公式<br> return t<br><br>possibleNum = findPossible(26)<br><br>print (possibleNum)<br>


