2013-12-17 7 views
33

mam żadnego problemu dla zrozumienia tego:Wyjaśnienie działania spisu?

a = [1,2,3,4] 
b = [x for x in a] 

Myślałem, że to wszystko, ale potem znalazłem ten fragment:

a = [[1,2],[3,4],[5,6]] 
b = [x for xs in a for x in xs] 

co sprawia b = [1,2,3,4,5,6]. Problem polega na tym, że mam problem ze zrozumieniem składni w [x for xs in a for x in xs]. Czy ktoś mógłby wyjaśnić, jak to działa?

+6

@SeanMcSomething, Wydaje się, że autorem jest ja. http://stackoverflow.com/a/20638000/2225682;) – falsetru

+1

@falsetru Że wersja itertools była lepsza ... –

+1

Tak, wersja itertools jest zrozumiała, ale zagnieżdżone rozumienie listowe przetopiło mój mózg na 5 minut –

Odpowiedz

44

Ach, niezrozumiałych "zagnieżdżone" listowe. Pętle rozwijają się w tej samej kolejności, co w zrozumieniu.

[leaf for branch in tree for leaf in branch] 

Pomaga myśleć tak w ten sposób.

for branch in tree: 
    for leaf in branch: 
     yield leaf 

PEP202 twierdzi tej składni z „ostatni wskaźnik różnej najszybciej” to „Right One”, zwłaszcza bez wyjaśnienia dlaczego.

+13

Za co jest warta , nie sądzisz, że "[liść dla liścia w gałęzi dla gałęzi w drzewie]" jest dużo bardziej czytelny dla człowieka? Chciałbym, żeby to działało w inny sposób. –

+7

Nie sądzę, aby któryś z nich był bardzo czytelny: ^) – wim

+2

Może to musi wiedzieć, że 'branch' istnieje przed' leaf'? Czytanie ze zrozumieniem od lewej do prawej. – Ray

3

To może być napisane jak to

result = [] 
for xs in a: 
    for x in xs: 
     result.append(x) 

można przeczytać więcej na ten temat here

7

b = [x for xs in a for x in xs] jest podobna do następujących zagnieżdżonych pętli.

b = [] 
for xs in a: 
    for x in xs: 
     b.append(x) 
3

Skutecznie:

...for xs in a...] 

jest iteracja ciągu głównego (zewnętrznej) listy i powrót każdego z podlist po kolei.

...for x in xs] 

to iteracja po każdej z tych list podrzędnych.

ten można ponownie zapisać jako:

b = [] 
for xs in a: 
    for x in xs: 
     b.append(x) 
17

jeśli a = [[1,2],[3,4],[5,6]], a następnie, jeśli rozwinąć tej listy Comp, otrzymujemy:

 +----------------a------------------+ 
     | +--xs---+ , +--xs---+ , +--xs---+ | for xs in a 
     | | x , x | | x , x | | x , x | | for x in xs 
a = [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] 
b = [ x for xs in a for x in xs ] == [1,2,3,4,5,6] #a list of just the "x"s 
+3

plus 1 dla ascii art, który najlepiej to wyjaśnia – slashdottir

2

Jest przykładem zagnieżdżonej zrozumieniem. Pomyśl o a = [[1,2],[3,4],[5,6]] jako macierzy 3 na 2 (macierz = [[1,2, [3,4], [5,6]]).

 ______ 
row 1 |1 | 2 | 
     ______ 
row 2 |3 | 4 | 
     ______ 
row 3 |5 | 6 | 
     ______ 

Zrozumienie listy to inny sposób na przeniesienie wszystkich elementów z tej macierzy do listy.

Spróbuję wyjaśnić to za pomocą różnych zmiennych, które, miejmy nadzieję, będą miały więcej sensu.

b = [element for row in matrix for element in row] 

Pierwsza pętla iteruje przez ponad rzędach wewnątrz matrycy, tj [1,2],[3,4],[5,6]. Druga pętla for iteruje po każdym elemencie na liście 2 elementów.

Napisałem mały artykuł na temat rozumienia list na mojej stronie internetowej http://programmathics.com/programming/python/python-list-comprehension-tutorial/, który w rzeczywistości dotyczył bardzo podobnego scenariusza do tego pytania. Podam również kilka innych przykładów i objaśnień dotyczących rozumienia list Pythona.

Nota prawna: Jestem twórcą tej witryny.

0

b = [x dla xs w for x in xs] jest taki sam jak:

b = [] 
for xs in a: 
    for x in xs: 
     b.append(x) 

Dla lepszego zrozumienia po prostu przejść od prawej do lewej strony i dodać do pętli jeden po drugim i jak tworzy listy X stał się elementem listy.

0

Wymienione listy to listy generujące się wewnętrzną pętlą for. Są bardzo częstym elementem w Pythonie i wyglądają mniej więcej tak:

[rzeczą rzeczą list_of_things]

Ok, świetnie, ale dlaczego miałbym tego używać?

Zrozumienia list są świetne do użycia, gdy chcesz zaoszczędzić trochę miejsca. Są także przydatne, gdy potrzebujesz szybko przetworzyć listę i wykonać kilka powtarzalnych czynności na tej liście. Są również bardzo przydatne, jeśli dowiadujesz się o programowaniu funkcjonalnym, ale jest to temat na późniejszy kurs (podpowiedź wskazówka).

Ale jeśli wszystko, co możesz zrobić, to pracować bezpośrednio na liście, zrozumienie listy nie byłoby tak użyteczne. Na szczęście mogą być używane z warunkami.