2

この時点まで、Pythonでは、一度に1つの要素を含めることを指定するリスト内包表記しか見たことがありません。たとえば、それらはすべて次の形式になっています

[f(x) for x in <iterable>]

一度に複数の要素を指定する方法はありますか?例えば、

[f(x), g(x) for x in <iterable>]

ある数xのすべての除数を計算するリスト内包表記を作成したいので質問していますが、これを可能な限り効率的に実行したいと思います。今、私は以下を使用しています、

[y for y in range(1,x+1) if x%y == 0]

でもこういうことをしたいのですが

[y, x/y for y in range(1, sqrt(x)+1) if x%y == 0]

これはより効率的であるため。ところで、私にはこれを行う実際的な理由はありません。誰かが私に言ったのは単に挑戦的な問題であり、目標は可能な限り最小で最も効率的なリスト内包表記でそれを行うことです。

前もって感謝します。

編集:わかりました、タプルを使用する必要があるようです。私はそれを避けようとしていましたが、リストをフラット化するために別の関数を作成する必要があるため、ソリューションが長くなります。

編集2:誰かがこの質問に出くわした場合に備えて、元の質問でやりたかったことに対する答えは次のとおりです。

[y for x in <iterable> for y in f(x), g(x)]

リスト内包表記のネストされたforループを使用して、ジョブを実行します。

4

5 に答える 5

5

あなたはそれをその場で平らにすることができます

[y if i else x/y for y in range(1, sqrt(x)+1) for i in 0,1 if x%y == 0]
于 2012-07-18T04:53:25.087 に答える
3

タプルに割り当てることができます

[(y, x/y) for y in range(1, int(sqrt(x))+1) if x%y == 0]

あなたの基本的な質問とはあまり関係ありませんが、あなたの例:の2番目のパラメーターをに変換する必要がrange()ありintましsqrt()float

投稿の再編集を更新します。

このタプルのリストをフラット化するには:

In [24]: s
Out[24]: [(1, 20), (2, 10), (4, 5)]

これを使って:

In [25]: import operator

タプルを作成します。

In [26]: reduce(operator.add, s, ())
Out[26]: (1, 20, 2, 10, 4, 5)

リストを作成します。

In [27]: list(reduce(operator.add, s, ()))
Out[27]: [1, 20, 2, 10, 4, 5]

:役立つコメントの中で、@ jamylakはそれを指摘し、順序O(N ^ 2)を実行し、使用reduceする方がはるかに効率的であることを示しています。これは、リストのサイズが大きくなるにつれてより重要になり、その場合は考慮する必要があります。operator.additertools.chain

于 2012-07-18T04:04:49.770 に答える
3

はい、できます。要素を括弧で囲む必要があります。取得するのはタプルのリストです。

>>> [(x, x+1) for x in range(5)]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
于 2012-07-18T04:04:56.343 に答える
2

とても近い:

[(y, x/y) for y in range(1, sqrt(x)+1) if x%y == 0]

タプルのリストを生成することは可能であり、もちろんこれらは複数の値を保持できます。

于 2012-07-18T04:04:31.443 に答える
1

はい、絶対に、値の前後に括弧を使用してください。

[(y, x/y) for y in range(1, sqrt(x)+1) if x%y == 0]
于 2012-07-18T04:05:04.907 に答える