30

次のようにして作成したタプルを解凍したいので、結果は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 に続く任意の数の操作を使用できます。

4

2 に答える 2

47

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

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)
于 2012-12-19T18:47:27.507 に答える
22
>>> 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]
于 2012-12-19T18:46:58.407 に答える