2013-04-01 19 views
5

私はまだPythonを学んでいますが、このコードは私のレベルを超えているようです。どういう意味ですか?あなたはこのような同等の明示的なループに任意のリストの内包表記に変換することができますこのPythonコードの意味を教えてください。

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'の文字列を'; 'を区切り文字として分割しています。分割リストのすべての項目について、区切り文字として'& 'に基づいて分割しています。 2番目のリストを 'pairs 'リストに分割する – Tuxdude

+0

[what a in for a]についての情報は、" list comprehension "を参照してください。スニペットにコメントを追加するには、qsオブジェクトの詳細を提供する必要があります。それでも文字列であると仮定すると、for-inの反復は、(& and ;) – wirrbel

答えて

11

:ルールは、彼らが表示されるために、forif句、巣それらのすべてを取ることです

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

、およびfooが最初の句の前に来るものについてはappend(foo)となります。

List Comprehensionのチュートリアルセクション(およびネストされたリスト内包語のサブセクション)ではこれについて説明しています...しかし、理解度をネストされたブロックステートメントに変換する簡単なルールはありません。簡単な事柄以外のすべてを理解しやすい。

urllib.parse.parse_qsl(または2.xのurlparse.parse_qsl)がクエリ文字列を解析するのに適していることにも注意してください。読みにくいネストされたリストの理解は含まれていないことに加えて、事前に考えていないあらゆる種類のもの(引用など)も適切に処理します。有用なバグレポートを提出する方法を知らないユーザー

+3

+1はネスティングのポイントです。恥ずかしいほど長い間、私の脳はいつもネストされたリストコンパイルを逆向きに読み込もうとしました。なぜなら、それと同等の部分が「最も深い」部分であることがわかっていて、それが最初に来たので、あなたはそれを "上から"だから誰かが「あなたがループを書いたのと全く同じ順序でリスト内包表記のループ部分を書いています。何がそんなに難しいのですか?あなたが今行った例を挙げました。それ以来、すべては明らかだった.. – DSM

+0

すべての助けをありがとう。今私はそれを理解する。最も混乱する部分は最初のs2です。最初はforループ、2番目はinnerループです。したがって、最初のs2は内側のs2の出力を取ることを意味します。わかった。 –

+0

@DSM:ええ、同じ問題がありました。ネストされていない内包物のみを処理する場合は、内部から読み込むことができます。しかし、一度入れ子になると、内部にある最初の部分を除いて、_actual_ルールが外にあることを知る必要があります。 (そして、genexpsを扱うときは、一番外側のイテレーターが実際には式全体の外に持ち上げられ、もっと楽しくなることを学ばなければなりません...) – abarnert

関連する問題