Próbowałem użyć wartości kompleksji listy zewnętrznej w wewnętrznym:

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

Ale niestety podnosi to nazwę, ponieważ nazwa y jest nieznana (chociaż kompleksowanie listy zewnętrznej określa go).

Czy to jest ograniczenie Pythona (2.7.3 i 3.2.3 wypróbowane) lub czy istnieje dobry powód, dla którego to nie działa?

Czy planuje się pozbyć się ograniczenia?

Czy są obejście (jakaś różna składnia może nie dowiedziałem się), aby osiągnąć to, czego chcę?

4
Alfe 13 sierpień 2012, 16:41

3 odpowiedzi

Najlepsza odpowiedź

Mówisz o liście Wymienia , a nie wyrażenia generatora.

Musisz zamienić swoje pętle:

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

Musisz je przeczytać, jakby były zagnieżdżone w regularnej pętli:

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

Wykonania listy z wieloma pętlami postępuj zgodnie z tym samym zamówieniem. Zobacz Dokumentacja rozumienia listy:

Po dostarczeniu rozumienia listy składa się z pojedynczej ekspresji, a następnie co najmniej jeden {x0}} klauzula i zero lub więcej for lub if klauzule. W tym przypadku elementy nowej listy są te, które byłyby wytworzone przez rozważanie każdego z klauzul for lub if. Element za każdym razem, gdy osiągnięty jest wewnętrzny blok.

To samo dotyczy wyrażeń generatora, oczywiście, ale nawiasy ()} nawiasów zamiast nawiasów kwadratowych i nie są natychmiast zmaterializowane:

>>> (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]
16
Martijn Pieters 13 sierpień 2012, 13:32

Próbowałeś:

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

Ponieważ wytwarza produkcję ... to produkuje:

[0, 0, 1]

Co może nie być tym, czego chciałeś ....

1
Daren Thomas 13 sierpień 2012, 12:44

Po prostu gniazdo innego gen.

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

Daje mi:

[[], [0], [0, 1]]
0
Inbar Rose 13 sierpień 2012, 12:43