这个Python列表推导有什么问题?

0 投票
2 回答
1425 浏览
提问于 2025-04-17 10:20

我在玩列表推导式的时候遇到了这个:

h = [ b for b in range(1, 9) for k in range(b, b*10) if k%2==0 for j in range(2*k, k*k)]

预期的结果是:

h = [1, 2, 3, 4, 5, 6, 7, 8]

但实际结果和预期不一样,里面有 len(h) = 196000 个项目。

请问这个是怎么回事?

2 个回答

4

你的列表推导式其实可以看成是这个:

h = []
for b in range(1, 9):
    for k in range(b, b * 10):
        if k % 2 == 0:
            for j in range(2 * k, k * k):
                h.append(b)

所以可能是你对嵌套列表推导式中循环的顺序理解错了。

可以试着把循环按它们在推导式中出现的顺序逐步展开(或者干脆避免使用三层嵌套的推导式——它们往往会变得让人看不懂!)。

4

你觉得这是预期的结果吗?

你的代码其实可以看作是:

h = []
for b in range(1, 9):
    for k in range(b, b*10):
        if k%2==0:
            for j in range(2*k, k*k):
                h.append(b)

所以,对于从1到8的每个数字,它会把这个数字添加到列表中很多次。

你还可以通过使用groupby来查看每个数字被添加了多少次:

>>> for i,j in itertools.groupby(h):
    print(i, sum(1 for i in j))

1 80
2 960
3 3640
4 9120
5 18392
6 32472
7 52328
8 79008

撰写回答