62

次のようにPythonでリストを生成したい-

[1, 1, 2, 4, 3, 9, 4, 16, 5, 25 .....]

あなたは理解したでしょう、それはただのことですn, n*n

次のようにPythonでそのようなリスト内包表記を書いてみました-

lst_gen = [i, i*i for i in range(1, 10)]

しかし、これを行うと、構文エラーが発生します。

リスト内包表記を介して上記のリストを生成する良い方法は何でしょうか?

4

13 に答える 13

54

使用itertools.chain.from_iterable:

>>> from itertools import chain
>>> list(chain.from_iterable((i, i**2) for i in xrange(1, 6)))
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25]

または、ジェネレーター関数を使用することもできます。

>>> def solve(n):
...     for i in xrange(1,n+1):
...         yield i
...         yield i**2

>>> list(solve(5))
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25]
于 2013-05-16T18:35:18.280 に答える
7

リスト内包表記は、一度に1 つの要素を生成します。代わりに、一度に 1 つの値のみを生成するようにループを変更することもできます。

[(i//2)**2 if i % 2 else i//2 for i in range(2, 20)]

またはタプルを生成するには、次を使用してリストをフラット化しますitertools.chain.from_iterable()

from itertools import chain

list(chain.from_iterable((i, i*i) for i in range(1, 10)))

出力:

>>> [(i//2)**2 if i % 2 else i//2 for i in range(2, 20)]
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]
>>> list(chain.from_iterable((i, i*i) for i in range(1, 10)))
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]
于 2013-05-16T18:38:04.577 に答える
5
lst_gen = sum([(i, i*i) for i in range(1, 10)],())

ああ、合計はおそらく1回の反復ルールに違反していることに言及する必要があります:(

于 2013-05-16T18:36:00.840 に答える
2

別のオプションは、一部の人にとってはひねくれたように見えるかもしれません

>>> from itertools import izip, tee
>>> g = xrange(1, 11)
>>> x, y = tee(g)
>>> y = (i**2 for i in y)
>>> z = izip(x, y)
>>> output = []
>>> for k in z:
...     output.extend(k)
... 
>>> print output
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100]
于 2013-05-16T19:10:33.983 に答える
1

別のオプション:

reduce(lambda x,y: x + [y, y*y], range(1,10), [])
于 2013-05-16T18:38:41.767 に答える
1
>>> lst_gen = [[i, i*i] for i in range(1, 10)]
>>> 
>>> lst_gen
[[1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
>>> 
>>> [num for elem in lst_gen for num in elem]
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]

ここに私の参照があります http://docs.python.org/2/tutorial/datastructures.html

于 2013-05-17T14:34:50.317 に答える
1

シンプルなものは次のとおりです。

[i ** j for i in range(1, 6) for j in [1, 2]]

これは、タスクと、リスト構成が2つのネストされたループを置き換えるという事実に関して非常に明確です(他の回答が示すように、いわば平坦化できます)。出力:

[1, 1, 2, 4, 3, 9, 4, 16, 5, 25]
于 2021-07-20T09:45:36.130 に答える
-1

この2つのライナーを試してください

lst = [[i, i*i] for i in range(10)]
[lst.extend(i) for i in lst]

必要に応じて数学を変更します。

さらに良い

#Change my_range to be the number you want range() function of
start = 1
my_range = 10
lst = [i/2 if i % 2 == 0 else ((i-1)/2)**2 for i in range(start *2, my_range*2 - 1)]
于 2015-08-07T10:10:37.140 に答える