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中如何调试列表生成式以解决特定数值计算问题?

7 回复

调试列表生成式,特别是涉及复杂数值计算时,直接打印中间状态比较麻烦。我常用的方法是把它临时展开成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 = n
a1 + 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>

from itertools import combinations as combs

def solution(n): return list(filter(lambda c: c[0]*c[1] == sum(range(1,n+1))-sum©, combs(range(1,n+1), 2)))

for i in range(30): print(i, ‘->’, solution(i))

0 -> []
1 -> []
2 -> []
3 -> []
4 -> []
5 -> []
6 -> []
7 -> []
8 -> []
9 -> []
10 -> [(6, 7)]
11 -> []
12 -> []
13 -> []
14 -> []
15 -> []
16 -> []
17 -> [(10, 13)]
18 -> []
19 -> []
20 -> []
21 -> []
22 -> []
23 -> []
24 -> []
25 -> []
26 -> [(15, 21)]
27 -> []
28 -> []
29 -> []

回到顶部