12

リスト/辞書/集合の内包的表現の反復ごとに2つ(またはそれ以上)の項目を出力する方法はありますか?簡単な例として、1から3までの整数のすべての正と負の倍精度浮動小数点数(つまり、{x | x = ±2n, n ∈ {1...3}})を出力するには、次のような構文がありますか?

>>> [2*i, -2*i for i in range(1, 4)]
[2, -2, 4, -4, 6, -6]

タプルを出力してフラット化できることは知っています(+i,-i)が、単一の理解を使用して問題を完全に解決する方法があるかどうか疑問に思いました。

現在、私は2つのリストを作成し、それらを連結しています(順序が重要でない場合は、機能します)。

>>> [2*i for i in range(1, 4)] + [-2*i for i in range(1, 4)]
[2, 4, 6, -2, -4, -6]
4

5 に答える 5

10

別のオプションは、ネストされた内包表記です。

r = [2*i*s for i in range(1, 4) for s in 1, -1]

より一般的なケースの場合:

r = [item for tpl in (<something that yields tuples>) for item in tpl]

元の例で:

r = [item for tpl in ((2*i, -2*i) for i in range(1, 4)) for item in tpl]

itertools.chain.from_iterable@Lattywareが言ったように私は本当に提案したいのですが。

于 2013-03-20T22:28:43.110 に答える
10

ネストされた理解の別の形式:

>>> [sub for i in range(1, 4) for sub in (2*i, -2*i)]
[2, -2, 4, -4, 6, -6]
于 2013-03-22T18:41:53.400 に答える
7

ここでの最良の答えはitertools.chain.from_iterable()、あなたが言うように、単にリストをフラット化するために使用することです:

itertools.chain.from_iterable((2*i, -2*i) for i in range(1, 4))

これは非常に読みやすく、ソースを2回繰り返す必要はありません(一部のイテレータが使い果たされる可能性があるため、問題が発生する可能性があり、余分な計算作業が必要になります)。

于 2013-03-20T22:25:12.603 に答える
4

itertools@Lattywareが提案した方法を使用しますが、ジェネレーターを使用したより一般的なアプローチも役立つ場合があります。

>>> def nums():
        for i in range(1, 4):
            yield 2*i
            yield -2*i


>>> list(nums())
[2, -2, 4, -4, 6, -6]
于 2013-03-20T22:27:32.993 に答える
2

PEP202によると、リスト内包表記から複数のオブジェクトを出力する方法はありません。

-フォーム[x, y for ...]は許可されていません。1つは書く必要があります [(x, y) for ...]

于 2013-03-20T22:31:14.353 に答える