W Pythonie możesz mieć wiele iteratorów ze zrozumieniem listy, takich jak
[(x,y) for x in a for y in b]
dla niektórych odpowiednich sekwencji a i b. Zdaję sobie sprawę z semantyki zagnieżdżonej pętli w zrozumieniu list Pythona.
Moje pytanie brzmi: czy jeden iterator w rozumieniu może odnosić się do drugiego? Innymi słowy: czy mogę mieć coś takiego:
[x for x in a for a in b]
gdzie aktualna wartość zewnętrznej pętli jest iteratorem wewnętrznej?
Na przykład, jeśli mam listę zagnieżdżoną:
a=[[1,2],[3,4]]
jakie byłoby wyrażenie ze zrozumieniem listy, aby osiągnąć ten wynik:
[1,2,3,4]
?? (Proszę wymienić tylko odpowiedzi na zrozumienie, ponieważ właśnie tego chcę się dowiedzieć).
python
list-comprehension
ThomasH
źródło
źródło
[x for b in a for x in b]
To zawsze dotyczyło Pythona. Ta składnia jest bardzo wsteczna. Ogólna formax for x in y
zawsze ma zmienną bezpośrednio po for, zasila wyrażenie po lewej stronie for. Gdy tylko dokonasz podwójnego zrozumienia, twoja ostatnio iterowana zmienna jest nagle tak „daleko”. Jest niezręczny i w ogóle nie czyta naturalnieMam nadzieję, że to pomaga komuś innemu, ponieważ
a,b,x,y
nie ma dla mnie większego znaczenia! Załóżmy, że masz tekst pełen zdań i potrzebujesz szeregu słów.Lubię rozumieć listę jako rozciąganie kodu w poziomie.
Spróbuj podzielić to na:
Przykład:
Działa to również w przypadku generatorów
źródło
Rany, chyba znalazłem odpowiedź: nie dbałem wystarczająco o to, która pętla jest wewnętrzna, a która zewnętrzna. Zrozumienie listy powinno wyglądać następująco:
aby uzyskać pożądany wynik, i tak, jedna bieżąca wartość może być iteratorem następnej pętli.
źródło
Kolejność iteratorów może wydawać się sprzeczna z intuicją.
Weź na przykład:
[str(x) for i in range(3) for x in foo(i)]
Rozłóżmy to:
źródło
[(output in loop 2) (loop 1) (loop 2)]
z(loop 1) = for i in range(3)
i(loop 2) = for x in foo(i):
a(output in loop 2) = str(x)
.ThomasH dodał już dobrą odpowiedź, ale chcę pokazać, co się stanie:
Myślę, że Python analizuje zrozumienie listy od lewej do prawej. Oznacza to, że pierwsza
for
występująca pętla zostanie wykonana jako pierwsza.Drugim „problemem” jest to, że
b
„wyciekają” ze zrozumienia listy. Po pierwszym udanym zrozumieniu listyb == [3, 4]
.źródło
x = 'hello';
[x for x in xrange(1,5)];
print x # x is now 4
Jeśli chcesz zachować tablicę wielowymiarową, należy zagnieździć nawiasy tablicowe. patrz przykład poniżej, w którym jeden jest dodawany do każdego elementu.
źródło
Ta technika pamięci bardzo mi pomaga:
[ <RETURNED_VALUE> <OUTER_LOOP1> <INNER_LOOP2> <INNER_LOOP3> ... <OPTIONAL_IF> ]
A teraz możesz pomyśleć o R eturn + O u -loop, jako o jedynej R Oght O ania
Znając powyższe, kolejność w liście wyczerpująca nawet dla 3 pętli wydaje się łatwa:
ponieważ powyższe jest po prostu:
w przypadku iteracji jednej zagnieżdżonej listy / struktury technika jest taka sama:
a
z pytania:dla siebie zagnieżdżony poziom
i tak dalej
źródło
Wydaje mi się, że łatwiej to zrozumieć
źródło
Dodatkowo, możesz użyć tej samej zmiennej dla elementu listy wejściowej, do którego jest aktualnie uzyskiwany dostęp, oraz dla elementu wewnątrz tego elementu. Może to jednak nawet uczynić go bardziej (listowym) niezrozumiałym.
Najpierw
for x in input
jest analizowany, co prowadzi do jednej listy członków danych wejściowych, następnie Python przechodzi przez drugą część,for x in x
podczas której wartość x jest nadpisywana przez bieżący element, do którego ma dostęp, a następnie pierwszax
określa, co chcemy zwrócić.źródło
Ta funkcja flatten_nlevel wywołuje rekurencyjnie zagnieżdżoną listę1, aby ukryć się na jednym poziomie. Wypróbuj to
wynik:
źródło
flatten_nlevel(sublist, flat_list)
, prawda ?!