我有一个清单
a = ['a', 'b', 'c']
给定长度的我希望在每个项目之后插入某个元素'x'
ax = ['a', 'x', 'b', 'x', 'c', 'x']
由于元素很大,我不想做很多pop
或子列表。
有什么想法吗?
答案 0 :(得分:6)
由于列表很大,最好的方法是使用生成器,比如
def interleave(my_list, filler):
for item in my_list:
yield item
yield filler
print list(interleave(['a', 'b', 'c'], 'x'))
# ['a', 'x', 'b', 'x', 'c', 'x']
或者你可以像这样返回一个链式迭代器
from itertools import chain, izip, repeat
def interleave(my_list, filler):
return chain.from_iterable(izip(my_list, repeat(filler)))
repeat(filler)
返回一个迭代器,它给filler
次无限次。
izip(my_list, repeat(filler))
返回一个迭代器,它一次从my_list
和repeat(filler)
中选取一个值。因此,list(izip(my_list, repeat(filler)))
的输出看起来像这样
[('a', 'x'), ('b', 'x'), ('c', 'x')]
现在,我们所要做的就是压扁数据。因此,我们将izip
的结果与chain.from_iterable
相关联,后者从迭代物中一次给出一个值。
答案 1 :(得分:2)
您是否考虑过itertools izip
?
izip('ABCD', 'xy') --> Ax By
izip_longest
可以与零长度列表,填充值一起使用,并通过chain.from_iterable
组合如下:
import itertools
list(itertools.chain.from_iterable(itertools.izip_longest('ABCD', '', fillvalue='x'))
>>> ['A', 'x', 'B', 'x', 'C', 'x', 'D', 'x']
答案 2 :(得分:2)
我倾向于使用列表理解来做这些事情。
a = ['a', 'b', 'c']
ax = [a[i/2] if i%2 == 0 else 'x' for i in range(2*len(a))]
print ax
['a', 'x', 'b', 'x', 'c', 'x']
答案 3 :(得分:1)
您可以使用嵌套列表推导生成列表
a = ['a', 'b', 'c']
ax = [c for y in a for x in y, 'x']
如果你真的不需要ax
作为一个列表,你可以制作这样的生成器
ax = (c for y in a for c in (y, 'x'))
for item in ax:
# do something ...