10

リストを拡張したい

[1,2,3,4]

nによって

たとえば、n = 2の場合:

[1,1,2,2,3,3,4,4]

私は、追加のライブラリなしでこれを達成するための可能な限り最小の方法を探しています。ループを実行して各アイテムを新しいリストにn回追加するのは簡単です...しかし、他の方法はありますか?

4

8 に答える 8

13
>>> l = [1,2,3,4]
>>> [it for it in l for _ in range(2)]
[1, 1, 2, 2, 3, 3, 4, 4]
于 2012-04-08T11:25:45.387 に答える
5

itertools [ドキュメント]救助へ:

expanded = list(chain(*izip(*tee(l, n))))
于 2012-04-08T11:22:45.433 に答える
4

コメントでこれを書き留めましたが、完全なコード例を示すことができるように、回答で説明する方が簡単です。これは、それ自体が完全なものではなく、他の人へのコンパニオンアンサーであることに注意してください。これは、特定の場合の単なる変更です。

可変オブジェクトでこれを行う必要がある場合は、ここに示されている他の方法を使用して障害にぶつかります。

>>> l = [1,2,3,[4]]
>>> test = [it for it in l for _ in range(2)]
>>> test
[1, 1, 2, 2, 3, 3, [4], [4]]
>>> test[6].append(5)
>>> test
[1, 1, 2, 2, 3, 3, [4, 5], [4, 5]]

そのcopy.deepcopy()ため、この動作を回避したい場合はを使用する必要があります。

>>> import copy
>>> l = [1,2,3,[4]]
>>> test = [copy.deepcopy(it) for it in l for _ in range(2)]
>>> test
[1, 1, 2, 2, 3, 3, [4], [4]]
>>> test[6].append(5)
>>> test
[1, 1, 2, 2, 3, 3, [4, 5], [4]]

当然、これはリスト内の可変オブジェクトにのみ必要であり、新しいリストの作成後にオブジェクトが変更されると予想される場合にのみ必要です。

于 2012-04-08T11:38:09.250 に答える
2
sum([[x]*2 for x in l],[])

lあなたのリストはどこにありますか

于 2012-04-08T11:37:47.973 に答える
2
>>> from itertools import chain, tee
>>> x = [1, 2, 3, 4]
>>> n = 2
>>> list(chain.from_iterable(zip(*tee(x, n))))
[1, 1, 2, 2, 3, 3, 4, 4]
于 2012-04-08T11:30:36.573 に答える
0

質問の作者はコメントで「可能な限り最小の方法」でコードの最小の長さを意味すると答えているので、私はあえて次の解決策を投稿します。

>>> sorted([1,2,3,4]*2)
[1, 1, 2, 2, 3, 3, 4, 4]

長さは19です。

于 2012-04-10T20:19:20.963 に答える
0
>>> from itertools import repeat, chain
>>> seq = [1, 2, 3, 4]
>>> list(chain.from_iterable(repeat(x, 2) for x in seq))
[1, 1, 2, 2, 3, 3, 4, 4]
于 2012-08-01T06:19:23.423 に答える
0
>>> from itertools import chain
>>> seq = [1, 2, 3, 4]
>>> list(chain.from_iterable(zip(*[seq]*2)))
[1, 1, 2, 2, 3, 3, 4, 4]
>>> list(chain.from_iterable(zip(*[seq]*6)))
[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]
于 2012-08-01T06:21:28.463 に答える