这个python列表理解有什么问题?

时间:2012-01-16 04:49:20

标签: python list bug-tracking list-comprehension

我正在玩列表推导并且遇到了这个:

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 个答案:

答案 0 :(得分: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 :(得分: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