Я хочу понять концепцию понимания списка в python - PullRequest
0 голосов
/ 14 февраля 2020

Код

x=[(a,b) for a in range(3) for b in range(a)]
print(x)

Вывод

[(1, 0), (2, 0), (2, 1)] 

Я знаю, что понимание можно разбить следующим образом:

for a in range(3):
    for b in range(a):
        print(a,b)

Может кто-нибудь объяснить мне, как вывод пришел как таковой, представленный выше ....

Ответы [ 4 ]

2 голосов
/ 14 февраля 2020

Понимание списка не переводится на:

for a in range(3):
    for b in range(a):
        print(a,b)

, а скорее на:

x = []
for a in range(3):
    for b in range(a):
        x.append((a, b))
1 голос
/ 14 февраля 2020

Вы работаете параллельно range(3) и range(a).

То, что эффективно происходит, так это то, что a устанавливается на 0, 1 и, наконец, 2.

Тогда ваш b определен для каждого элемента в range(a).

Теперь генерируются данные:

a = 0
range(0) # nothing
a = 1
range(1) # (0, )
(1, 0) # first pair of (a, b) for a = 1
a = 2
range(2) # (0, 1)
(2, 0) # first pair of (a, b) for a = 2
(2, 1) # second pair of (a, b) for a = 2
# end

Учитывая вышеизложенное, результат в итоге становится [(1, 0), (2, 0), (2, 1)]

0 голосов
/ 14 февраля 2020

Я думаю, что вы ищете это:

  1. сначала, a=0, поэтому внутренний l oop пропускается, когда range(0) возвращает пустой список.
  2. затем a=1, поэтому внутренний l oop выполняется только для 0, поскольку диапазон (1) соответствует [0], поэтому первая пара равна (1, 0)
  3. a=2 и Внутренний l oop работает на b=0 и b=1, следовательно, две другие пары (2, 0) и (2, 1)

Я думаю, что сейчас ясно. право?

0 голосов
/ 14 февраля 2020

что понимает список, так это:

ret = []
for a in range(3):
    for b in range(a):
        ret.append((a,b))

print(ret)  # [(1, 0), (2, 0), (2, 1)] 

, который возвращает список, который вы получаете ...

...