Najlepszym źródłem informacji jest oficjalny samouczek Pythona dotyczący rozumienia list . Listy składane są prawie takie same jak pętle for (z pewnością każde rozumienie list można zapisać jako pętlę for), ale często są one szybsze niż użycie pętli for.
Spójrz na to dłuższe rozumienie listy z samouczka ( if
część filtruje rozumienie, tylko części, które przechodzą instrukcję if, są przekazywane do końcowej części rozumienia listy (tutaj (x,y)
):
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Działa dokładnie tak samo, jak ta zagnieżdżona pętla for (i, jak mówi samouczek, zwróć uwagę, jak kolejność for i if są takie same).
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Główną różnicą między rozumieniem listy a pętlą for jest to, że ostatnia część pętli for (w której coś robisz) pojawia się na początku, a nie na końcu.
Przejdźmy do pytań:
Jakiego typu musi być obiekt, aby użyć go do struktury pętli?
Iterable . Dowolny obiekt, który może wygenerować (skończony) zbiór elementów. Należą do nich wszelkie kontenery, listy, zestawy, generatory itp.
Jaka jest kolejność, w jakiej i i j są przypisywane do elementów w obiekcie?
Są przypisywane dokładnie w tej samej kolejności, w jakiej są generowane z każdej listy, tak jakby były w zagnieżdżonej pętli for (dla pierwszego zrozumienia dostaniesz 1 element dla i, a następnie każdą wartość z j, drugi element do i, następnie każda wartość z j itp.)
Czy można to zasymulować inną strukturą pętli for?
Tak, już pokazane powyżej.
Czy pętla for może być zagnieżdżona z podobną lub inną strukturą pętli? A jak by to wyglądało?
Jasne, ale to nie jest dobry pomysł. Tutaj, na przykład, daje listę list znaków:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]
Może Cię zainteresować
itertools.product
funkcja, która zwraca iterowalne, dając krotki wartości ze wszystkich iterowalnych, które ją przekazujesz. Oznacza to, żeitertools.product(A, B)
zwraca wszystkie wartości formularza(a, b)
, skąda
pochodzą wartościA
ib
skąd pochodząB
. Na przykład:To drukuje:
Zauważ, że ostatni przekazany argument
itertools.product
jest argumentem „wewnętrznym”. Ogólnie jest równyitertools.product(a0, a1, ... an)
[(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]
źródło
Po pierwsze, twój pierwszy kod nie używa pętli for per se, ale rozumienia listy .
Byłoby równoważne
dla j w zakresie (0, szerokość): dla i w zakresie (0, wysokość): m [i] [j]
Podobnie jak w przypadku pętli, od prawej do lewej. Ale składnia list złożonych jest bardziej złożona.
Nie jestem pewien, o co chodzi w tym pytaniu
Dowolny iterowalny obiekt, który daje iterowalne obiekty, które dają dokładnie dwa obiekty (co za kęs - tj.
[(1,2),'ab']
Byłby prawidłowy)Kolejność, w jakiej obiekt podlega iteracji.
i
idzie do pierwszego plonu,j
drugiego.Tak, ale nie tak ładnie. Uważam, że jest funkcjonalnym odpowiednikiem:
lub jeszcze lepiej użyj mapy :
Ale oczywiście funkcja musiałaby dostać
i
,j
sam.Czy to nie jest to samo pytanie co 3?
źródło
Możesz użyć dwóch pętli for w tej samej linii, używając
zip
funkcjiKod:
Wynik:
['Abbas', 'Kamran', 'Ali', 'Asgar', 'Usman', 'Hamza']
Tak więc, używając funkcji zip, możemy użyć dwóch pętli for lub możemy iterować dwie listy w tym samym wierszu.
źródło
Poniższy kod zawiera najlepsze przykłady zagnieżdżonych pętli. Podczas używania dwóch pętli for należy pamiętać, że wyjście pierwszej pętli jest wejściem dla drugiej pętli. Zakończenie pętli jest również ważne podczas korzystania z zagnieżdżonych pętli
źródło