web-dev-qa-db-ja.com

Pythonリスト内包表記、解凍、および複数の操作

次のようにして作成したタプルを解凍したいので、結果は1つの単純なリストになります。 2〜3行で目的の結果を得ることができますが、確かにoneliner list.compがありますか?

x = range(10)
y = [(i,j**2) for i,j in Zip(x,x)]
>>>y
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9
, 81)]
>>>

私が欲しいのはresult = [0,0,1,1,2,4,3,9.....]

やってる

y = len(x)*[0]
y[::2] = x
y[1::2] = [i**2 for i in x]

私が欲しいものを与えますが、より一般的なケースが必要な場合はどうなりますか?

y = [(i, sqrt(i), i**3, some_operation_on_i, f(i), g(i)) for i in x]

たとえば、各iを追跡するために1つの操作(正方形)のみを指定した結果のようなストレートリストを取得できるはずですが、各iの後に任意の数の操作が続きます。

16
arynaq

ネストされたリスト内包表記を使用します。

result = [a for tup in y for a in tup]

例:

>>> x = range(10)
>>> y = [(i,j**2) for i,j in Zip(x,x)]
>>> [a for tup in y for a in tup]
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]

これは、より一般的なケースでも問題なく機能します。または、すべてを1つのステップで実行できます。

y = [a for i in x for a in (i, sqrt(i), i**3, some_operation_on_i, f(i), g(i))]

ネストされたリスト内包表記が奇妙に見える場合、これが通常のforループとしてどのように見えるかを次に示します。

y = []
for i in x:
    for a in (i, sqrt(i), i**3, some_operation_on_i, f(i), g(i)):
        y.append(a)
25
Andrew Clark
>>> import itertools
>>> list(itertools.chain.from_iterable(y))
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]
16
Tim Pietzcker