вложенные списки

python list syntax list-comprehension

1318 просмотра

3 ответа

Я попытался использовать значение понимания внешнего списка во внутреннем:

[ x for x in range(y) for y in range(3) ]

Но, к сожалению, это вызывает ошибку NameError, потому что имя yнеизвестно (хотя его определяет внешний список).

Это ограничение Python (пробовал 2.7.3 и 3.2.3) или есть веская причина, почему это не может работать?

Есть ли планы избавиться от ограничения?

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

Автор: Alfe Источник Размещён: 12.11.2019 09:07

Ответы (3)


16 плюса

Решение

Вы говорите о списочном понимании , а не о выражениях генератора.

Вам нужно поменять местами петли:

[ x for y in range(3) for x in range(y) ]

Вы должны прочитать их, как если бы они были вложены в обычный цикл:

for y in range(3):
    for x in range(y):
        x

Понимания списка с несколькими циклами следуют в том же порядке. Смотрите список документов для понимания :

Когда предоставляется понимание списка, оно состоит из одного выражения, за которым следует хотя бы одно forпредложение и ноль или более forили ifпредложения. В этом случае элементы нового списка являются те , которые будут получены при рассмотрении каждого из forили ifМорозов блока, гнездящиеся слева направо, и вычисление выражения для получения списка элементов каждый раз , когда будет достигнут самый внутренний блок.

То же самое относится и к выражениям генератора, но они используют ()круглые скобки вместо квадратных скобок и не сразу материализуются:

>>> (x for y in range(3) for x in range(y))
<generator object <genexpr> at 0x100b50410>
>>> [x for y in range(3) for x in range(y)]
[0, 0, 1]
Автор: Martijn Pieters Размещён: 13.08.2012 12:42

1 плюс

Ты пробовал:

[x for y in range(3) for x in range(y)]

Потому что это производит вывод ... Это производит:

[0, 0, 1]

Который может или не может быть тем, что вы хотели ....

Автор: Daren Thomas Размещён: 13.08.2012 12:44

0 плюса

просто гнездо другого поколения.

[ x for x in [range(y) for y in range(3) ]]

дает мне:

[[], [0], [0, 1]]
Автор: Inbar Rose Размещён: 13.08.2012 12:43
Вопросы из категории :
32x32