内存有效填充列表

时间:2014-04-03 07:58:14

标签: python

我有一个清单

a = ['a', 'b', 'c']
给定长度的

我希望在每个项目之后插入某个元素'x'

ax = ['a', 'x', 'b', 'x', 'c', 'x']

由于元素很大,我不想做很多pop或子列表。

有什么想法吗?

4 个答案:

答案 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)))
  1. repeat(filler)返回一个迭代器,它给filler次无限次。

  2. izip(my_list, repeat(filler))返回一个迭代器,它一次从my_listrepeat(filler)中选取一个值。因此,list(izip(my_list, repeat(filler)))的输出看起来像这样

    [('a', 'x'), ('b', 'x'), ('c', 'x')]
    
  3. 现在,我们所要做的就是压扁数据。因此,我们将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 ...