Что не так в этом понимании списка Python? - PullRequest
0 голосов
/ 16 января 2012

Я просто играл со списком и наткнулся на это:

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 голосов
/ 16 января 2012

Почему вы думаете, что это ожидаемый результат?

Ваш код эквивалентен:

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
4 голосов
/ 16 января 2012

Ваш список comp эквивалентен этому:

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)

Так что, вероятно, это просто ваше понимание порядка циклов в понимании вложенного списка было неверным.

Мысленно расширяйте петли в том же порядке, в котором они появляются в понимании (или избегайте тройного вложенного понимания - у них есть привычка становиться непостижимым!).

...