Python list comprehension double for
質問
vec = [[1,2,3], [4,5,6], [7,8,9]]
print [num for elem in vec for num in elem] <----- this
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]
これには騙されました。
からelemはリスト内部のリストと理解しています。
for elem in vic
の使い方がよくわからないのですが
num
と
for num in elem
を最初と最後に記述します。
pythonはこれをどう解釈するのでしょうか?
どのような順序で見るのでしょうか?
どのように解決するのですか?
分解してみましょう。
簡単なリスト理解。
[x for x in collection]
これはパーツに分けるとわかりやすいですね。
[A for B in C]
-
A
は結果のリストに含まれる項目です。 -
B
はコレクション内の各項目C
-
C
はコレクションそのものです。
このように、人は書くことができる。
[x.lower() for x in words]
リスト内の単語をすべて小文字に変換するため。
このように別のリストで複雑にする場合です。
[x for y in collection for x in y] # [A for B in C for D in E]
ここで、特別なことが起こります。最終的なリストには
A
の項目と
A
の中にある
B
の中にあるので、リスト内包にそれを伝えなければなりません。
-
A
は結果のリストに含まれる項目です。 -
B
はコレクション内の各項目C
-
C
はコレクションそのものです。 -
D
はコレクション内の各項目E
(である(この場合、さらにA
) -
E
は別のコレクションです(この場合。B
)
このロジックは、通常のforループと同様です。
for y in collection: # for B in C:
for x in y: # for D in E: (in this case: for A in B)
# receive x # # receive A
これを発展させ、素晴らしい例+説明をするために、電車があると想像してください。
電車のエンジン(前)は必ずそこにある(リストコンパの結果)
次に、列車の車両は何両でもあり、それぞれの列車の車両は、形が
for x in y
リスト内包はこのようになります。
[z for b in a for c in b for d in c ... for z in y]
というのは、このような普通のfor-loopがあるようなものでしょう。
for b in a:
for c in b:
for d in c:
...
for z in y:
# have z
つまり、行を下ってインデントするのではなく、リストコンパチブルでは次のループを最後に追加すればよいのです。
電車の例えに戻ると
Engine
-
Car
-
Car
-
Car
...
Tail
末尾とは何ですか?末尾はリストコンパチブルの中では特別なものです。あなたは は必要ありません。 は必要ありませんが、もし末尾があれば、末尾は条件となり、この例を見てください。
[line for line in file if not line.startswith('#')]
これは、ハッシュタグで始まらない限り、ファイル内のすべての行を取得することができます (
#
) で始まっていなければ、他の行はスキップされます。
列車の "tail" を使用するトリックは、すべてのループから最終的な「エンジン」または「結果」を得るのと同時に True/False をチェックすることで、通常の for ループで上記の例は次のようになります。
for line in file:
if not line.startswith('#'):
# have line
ご注意ください。 私の汽車の例えでは、汽車の最後には「尾」があるだけですが、条件や「尾」は次のようになります。 ごとに 車両」またはループの後である可能性があります...
例えば
>>> z = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> [x for y in z if sum(y)>10 for x in y if x < 10]
[5, 6, 7, 8, 9]
通常のfor-loopで。
>>> for y in z:
if sum(y)>10:
for x in y:
if x < 10:
print x
5
6
7
8
9
関連
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] リスト内包型辞書の作成
-
[解決済み] リスト内包のif/else
-
[解決済み] リストの変更が不意にサブリスト全体に反映されたリスト
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】リストコンプリヘンションのダブルイテレーション
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法