在列表中的每个项之后插入一个项目(Python)

时间:2012-11-04 15:34:12

标签: python list insert

说我有这样的清单:

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

我怎么能

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

作为输出?

9 个答案:

答案 0 :(得分: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']]

答案 1 :(得分:3)

我喜欢这里发布的基于itertools的解决方案,但这里的方法不需要列表推导或itertools,我敢打赌它超级快。

new_list = [filler] * (len(a) * 2)
new_list[0::2] = a

答案 2 :(得分:2)

不是pythonic但似乎有用。

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

发现这篇文章: Add an item between each item already in the list

答案 3 :(得分: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']]

答案 4 :(得分:1)

类似于使用itertools.islice()itertools.cycle()

的内容

cycle()用于重复某个项目,并使用islice()将重复次数减少到len(a),然后使用izip()或简单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']]

答案 5 :(得分:0)

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

for i in a:
    out.append(i)
    out.append(filler)

答案 6 :(得分:0)

result = [si for i in zip(a, [filler]*len(a)) for si in i]

答案 7 :(得分: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]的生成器,然后展平生成的对流。为了提高效率,第一步是使用生成器来执行,以避免不必要的中间列表。

<强>更新

这篇文章是一个教科书的例子,说明为什么不能在网上论坛中提供巨魔。看评论,看看我的意思。最好不要理会这个巨魔。

答案 8 :(得分:-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)]