2013-04-01 12 views
5

Nadal uczę się Pythona, ale ten kod wydaje się być poza moim poziomem. co to znaczy?Proszę wyjaśnić mi, co oznacza ten kod Pythona?

pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] 
+2

Czy widzieliście już wcześniej listę? A jeśli tak, czy próbowałeś czytać [to pytanie] (http://stackoverflow.com/questions/1198777/double-iteration-in-list-comprehension)? –

+0

Dzielisz ciągi znaków w 's1' z'; 'jako ogranicznikiem, a na każdym elemencie tej podzielonej listy dzielisz na podstawie' & 'jako ogranicznika, a wynik jest wynikiem po drugie podziel się na listę 'par' – Tuxdude

+0

powinieneś zajrzeć do" listy zrozumienie ", aby uzyskać informacje o [a za cokolwiek]. Aby uzyskać więcej komentarzy na temat twojego fragmentu, powinieneś podać szczegóły na obiekcie qs. Zakładając, że jest to ciąg, it-in iteracje działają na liście łańcuchów, które są spearated przez (& and ;) – wirrbel

Odpowiedz

11

można przekonwertować dowolny listowych do równoważnej wyraźnej pętli jak ta:

pairs = [] 
for s1 in qs.split('&'): 
    for s2 in s1.split(';'): 
     pairs.append(s2) 

Zasadą jest podejmowanie wszelkich klauzul for i if, gniazdo je w takiej kolejności, w jakiej występują, oraz następnie append(foo) dla każdego foo pojawia się przed pierwszym zdaniu.

Sekcja samouczka na temat List Comprehension (i podsekcji ze zrozumieniem listy zagnieżdżonej) wyjaśnia to ... ale nie daje ona prostej zasady przekształcania jakiegokolwiek zrozumienia w zagnieżdżone wyrażenie blokowe, które (moim zdaniem) czyni je bardzo łatwiej zrozumieć wszystkie, oprócz drobnych spraw.

Warto również zauważyć, że urllib.parse.parse_qsl (lub urlparse.parse_qsl w 2.x) jest lepszym sposobem na analizowanie ciągów zapytań. Poza tym, że nie zawiera trudnego do odczytania zagnieżdżonego spisu list, poprawnie obsługuje również wszystkie rodzaje rzeczy (np. Cytowanie), o których nie pomyślałbyś wcześniej i zakończy debugowanie dla jednego z twoich użytkownicy, którzy nie wiedzą, jak przesłać przydatne raporty o błędach.

+3

+1 dla punktu zagnieżdżenia. Przez żenująco długi czas mój mózg zawsze próbował czytać zagnieżdżone kompilacje list do tyłu, ponieważ wiedziałem, że odpowiednik tego fragmentu był częścią "najgłębszą", i to było pierwsze, więc pomyślałem, że napisałeś to "w górę" od najgłębszej. Któregoś dnia TAK ktoś powiedział: "spisujesz pętlę części spisu w dokładnie tej samej kolejności, w której piszesz pętle, co jest takiego trudnego?" i podałem przykład, który właśnie zrobiłeś. Od tego czasu wszystko było jasne .. – DSM

+0

Bardzo dziękuję za wszelką pomoc. Teraz to rozumiem. Najbardziej mylącą częścią jest pierwsza s2. Pierwszym z nich jest pętla zewnętrzna, a drugą pętla wewnętrzna. Zatem pierwsze s2 oznacza pobranie wyjścia s2, które jest wewnętrznym. Rozumiem. –

+0

@DSM: Tak, miałem ten sam problem. Jeśli zajmujesz się tylko zagnieżdżonymi spostrzeżeniami, możesz je przeczytać od środka. Ale kiedy są już zagnieżdżone, musisz się nauczyć, że zasada _actual_ jest na zewnątrz, z wyjątkiem pierwszej części, która przechodzi od środka. (A potem, kiedy mamy do czynienia z genexpami, musisz nauczyć się, że najbardziej zewnętrzny iterator jest rzeczywiście uniesiony poza całą ekspresją, aby jeszcze bardziej zabawić ...) – abarnert

Powiązane problemy