1

假设我有一个这样的列表:

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

我怎么能得到

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

作为输出?

4

9 回答 9

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 回答
3

我喜欢itertools这里发布的基于 - 的解决方案,但这是一种不需要列表理解或的方法itertools,我敢打赌它非常快。

new_list = [filler] * (len(a) * 2)
new_list[0::2] = a
于 2012-11-04T16:19:22.290 回答
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()overa和返回的迭代器islice(),这将返回元组列表。

然后,您可以使用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 回答