8

私は次のようなことをしたい:

all = [ x for x in t[1] for t in tests ]

テストは次のようになります。

[ ("foo",[a,b,c]), ("bar",[d,e,f]) ]

だから私は結果が欲しい

all = [a,b,c,d,e,f]

私のコードは機能しません、Pythonは言います:

UnboundLocalError: local variable 't' referenced before assignment

それを行う簡単な方法はありますか?

4

4 に答える 4

17

逆に機能するはずです。

all = [x for t in tests for x in t[1]]
于 2009-11-09T10:07:11.167 に答える
5

疑わしい場合は、リスト内包表記を使用しないでください。

import thisPythonシェルで試して、2行目を読んでください。

Explicit is better than implicit

このタイプのリスト内包表記の複合は、多くのPythonプログラマーを困惑させるので、少なくとも文字列を削除して残りのリストをフラット化することを説明するコメントを追加します。

リスト内包表記は、明確で理解しやすい場所で使用してください。特に、慣用的な場合、つまり、何かを表現するための最も効率的またはエレガントな方法であるため、一般的に使用されている場合に使用してください。たとえば、このPythonイディオムの記事には次の例があります。

result = [3*d.Count for d in data if d.Count > 4]

それは明確で、単純で、簡単です。ネストリストの内包表記は、書式設定に注意を払えばそれほど悪くはありません。中かっこは読者が式を分解するのに役立つため、コメントを追加することもできます。しかし、この問題に対して受け入れられた解決策は複雑すぎて、私の意見では混乱を招きます。それは限界を超えて、あまりにも多くの人々にとってコードを読めなくします。少なくとも1回の反復をforループに展開することをお勧めします。

于 2009-11-09T10:26:17.977 に答える
2

いくつかのリストを足し合わせるだけの場合は、[]を開始値として使用して、組み込みの合計を試してください。

all = sum((t[1] for t in tests), [])
于 2009-11-09T16:57:37.657 に答える
1

それは私には減少のように見えます。残念ながら、Pythonはreduceの構文糖衣を提供していないため、ラムダを使用する必要があります。

reduce(lambda x, y: x+y[1], tests, [])
于 2009-11-09T16:50:47.473 に答える