1

次のようなリストがあるとします。

a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']

どうすれば入手できますか

b = [[1 ,2 ,3], ['cat'], [4, 5, 6], ['cat']] 

アウトプットとして?

4

9 に答える 9

3

私はitertoolsここに投稿されたベースのソリューションが好きですが、リスト内包表記やを必要としないアプローチがあり、それはitertools超高速だと思います。

new_list = [filler] * (len(a) * 2)
new_list[0::2] = a
于 2012-11-04T16:19:22.290 に答える
3

私は次のようなものに itertools を使用することを好みます:

>>> import itertools as it
>>> a = [[1, 2, 3], [4, 5, 6]]
>>> filler = ['cat']
>>> list(it.chain.from_iterable(it.izip(a, it.repeat(filler))))
[[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]
于 2012-11-04T15:42:58.817 に答える
2

Pythonicではありませんが、うまくいくようです。

list = [[1, 2, 3], [4, 5, 6]]
result = []
for e in list:
    result.append(e)
    result.append(['cat'])
result.pop()

この投稿で見つかりました: リストに既にある各アイテムの間にアイテムを追加します

于 2012-11-04T15:39:24.853 に答える
2

ここにアイデアがあります:

import itertools

a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']
print list(itertools.chain.from_iterable(zip(a, [filler] * len(a))))

出力:

[[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]
于 2012-11-04T15:40:00.940 に答える
1

itertools.islice()と を使用したこのようなものitertools.cycle()

cycle()を使用してアイテムを繰り返し、 を使用して繰り返しislice()回数を に切り、len(a)次にizip()or を単純に使用し、 によって返されるイテレータを使用すると、タプルのリストが返されzip()ます。aislice()

を使用してこれを平坦化できますitertools.chain()

In [72]: a
Out[72]: [[1, 2, 3], [4, 5, 6]]

In [73]: b
Out[73]: ['cat']

In [74]: cyc=islice(cycle(b),len(a))

In [75]: lis=[]

In [76]: for x in a:
    lis.append(x)
    lis.append([next(cyc)])
   ....:     

In [77]: lis
Out[77]: [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]

また:

In [108]: a
Out[108]: [[1, 2, 3], [4, 5, 6]]

In [109]: b
Out[109]: ['cat']

In [110]: cyc=islice(cycle(b),len(a))

In [111]: list(chain(*[(x,[y]) for x,y in izip(a,cyc)]))
Out[111]: [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]
于 2012-11-04T15:52:31.130 に答える
0
a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']
out = []

for i in a:
    out.append(i)
    out.append(filler)
于 2012-11-04T15:40:16.017 に答える
0
result = [si for i in zip(a, [filler]*len(a)) for si in i]
于 2012-11-04T15:42:22.830 に答える
0

ワンライナーとしてこれを試してください:

from operator import add
a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']

reduce(add, ([x, filler] for x in a))
> [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]

または、使用せずにさらに簡単にreduce:

sum(([x, filler] for x in a), [])
> [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]

どちらのソリューションも同じことを行います。まず、ジェネレーターを作成し[element, filler]、結果のペアのストリームを平坦化します。効率化のため、最初のステップはジェネレーターを使用して実行され、不要な中間リストが回避されます。

アップデート:

この投稿は、オンライン フォーラムで荒らしに餌を与えてはならない理由の教科書的な例です。コメントを見て、私が何を意味するかを確認してください。トロールは無視したほうがいいです。

于 2012-11-04T15:46:05.093 に答える
-1
    python 3.2

    a = [[1, 2, 3], [4, 5, 6]]
    b = ['cat']
    _=[a.insert(x,b) for x in range(1,len(a)*2,2)]
于 2012-11-04T17:08:12.387 に答える