6

私が取り組んでいるモジュールでこのコードを見つけました:

l = opaque_function()
thingys = [x for y in l for x in y]

これが読めません。実験により、2 レベルのネストされたリストをフラット化していると判断できましたが、シンテックスはまだ不透明です。いくつかのオプションのブラケットが明らかに省略されています。

>>> l = [[1,2],[3,4]]
>>> [x for y in l for x in y]
[1, 2, 3, 4]

[x for y in [l for x in y] ]私の目はそれを :またはとして解析したいと考えていますが、どちらも定義されていない[ [x for y in l] for x in y ]ために失敗します。y

これはどう読むべきでしょうか?

(このことを説明されると、とても恥ずかしくなると思います。)

4

4 に答える 4

6

これは私を本当に混乱させていました。ネストされたループのように読む必要があります。

new_list = []
for y in l:
    for x in y:
        new_list.append(x)

になる

for y in l for x in y [do] new_list.append(x)

になる

[x for y in l for x in y]
于 2012-09-25T15:10:12.480 に答える
5

これは次のように読む必要があります。

for y in l:
    for x in y:
        yield x

これはジェネレーター バージョンですが、すべての内包x表記は同じ基本的な構文を持っています。私も最初はこれに戸惑い、逆だと思っていましたが、フィルタリング式を追加すると意味がわかりました。

>>> l = [[1,2,3,4,5], [1,"foo","bar"], [2,3]]
>>> [x for y in l
...    if len(y) < 4
...    for x in y
...    if isinstance(x, int)]
[1, 2, 3]

ここで、この全体を逆に記述する必要があると想像してください。

[x if isinstance(x, int)
   for x in y
   if len(y) < 4
   for y in l]

これは、Python パーサーを保守している人は言うまでもなく、ベテランの Prolog プログラマーにとっても混乱を招くでしょう :)

現在の構文は、そもそもリスト内包表記に影響を与えたHaskellの構文とも一致します。

于 2012-09-25T15:10:40.870 に答える
1
lis=[x for y in l for x in y] is Equivalent to:


lis=[]
for y in l:
   for x in y:
      lis.append(x)
于 2012-09-25T15:10:30.337 に答える