2013-04-01 1 views
5

나는 여전히 파이썬을 배우지 만이 코드는 내 수준을 넘어선 것처럼 보입니다. 무엇 않습니다 그 의미?이 파이썬 코드가 무엇을 의미하는지 설명해주십시오.

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

이전에 목록을 보았습니까? 그렇다면 [이 질문] (http://stackoverflow.com/questions/1198777/double-iteration-in-list-comprehension)을 읽어 보았습니까? –

+0

's1'의 문자열을 구분 기호로';'를 사용하여 분리하고, 그 분할 목록의 모든 항목에 대해 구분 기호로'&'를 사용하여 분리하면, 두 번째 목록을 '쌍'으로 나눕니다. – Tuxdude

+0

[무엇이든간에]에 대한 정보는 "목록 이해"를 조사해야합니다. 스 니펫에 대한 추가 설명을 원하면 qs 객체에 대한 세부 정보를 제공해야합니다. 그러나 그것이 문자열이라고 가정하면 for-in 반복은 (& and ;) – wirrbel

답변

11

당신은이 같은 동등한 명시 적 루프에있는 지능형리스트를 변환 할 수 있습니다

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

규칙은 forif 조항을 모두 걸릴 것입니다, 그들이 나타나는 순서에 둥지를하고, 첫 번째 절 앞에 오는 foo에 대해서는 append(foo)입니다.

List Comprehension (및 중첩 된 목록 이해법에 대한 하위 절)의 튜토리얼 섹션에서 설명하지만 ... 내포 된 블록 문으로 변환하는 간단한 규칙은 제공하지 않습니다. 사소한 경우를 제외한 모든 것을 이해하기 쉽습니다.

또한 urllib.parse.parse_qsl (또는 2.x의 경우 urlparse.parse_qsl)이 쿼리 문자열을 구문 분석하는 데 더 좋은 방법이라는 점도 유의해야합니다. 읽기 어려운 중첩 목록 이해를 포함하지 않는다는 것 외에도, 사전에 생각하지 않을 모든 종류의 (인용과 같은) 것들을 적절하게 처리하고, 여러분 중 하나의 디버깅을 끝낼 것입니다 유용한 버그 리포트를 제출하는 방법을 모르는 사용자.

+3

+1 중첩 포인트. 당황스럽게 오랜 시간 동안, 내 머리가 항상 중첩 된 목록 작성기를 거꾸로 읽으려고했는데, 그 이유는 동등한 부분을 추가하는 것이 "가장 깊은"부분이라는 것을 알고 있었기 때문입니다. 그래서 가장 먼저 작성한 부분부터 "위쪽으로"작성했다고 생각했기 때문입니다. 그래서 어느 날 누군가가 말했습니다. "목록 작성법의 반복 부분을 정확히 같은 순서로 써야 루프를 작성할 수 있습니다. 뭐가 그렇게 어렵습니까?" 방금 한 모범을 보여주었습니다. 그때 이후로, 모든 것이 분명해졌습니다. – DSM

+0

대단히 고맙습니다. 이제 나는 그것을 이해한다. 가장 혼란스러운 부분은 처음 s2입니다. 첫 번째는 out 루프이고 두 번째는 inner loop입니다. 따라서 첫 번째 s2는 s2의 출력을 의미합니다. 알 겠어. –

+0

@DSM : 그래, 나는 똑같은 문제가 있었다. 중첩이 아닌 내재 된 부분 만 다룰 경우 내부에서 읽습니다. 그러나 중첩 된 후에는 _ 내부 _ 규칙이 외부에 있음을 알아야합니다. 단, 내부에있는 첫 부분은 예외입니다. (그리고 나서, genexps를 다룰 때, 가장 바깥 쪽의 반복자가 실제로 전체 표현식을 벗어나서 더 재미있게 만들어지는 것을 배워야합니다 ...) – abarnert

관련 문제