在python中使用列表理解扩展列表
因此,让我们说我有列表 项目 = ['abc','def','tre']。在python中使用列表理解扩展列表
现在我想在每个列表项前插入一个标志。
例如,新列表项目2应该是['-g','abc','-g','def','-g','tre']。
我可以读取列表并在追加标志后追加每一个,但是我想开始以python的方式进行操作。
我想出是:
items2.extend(['-g', i] for i in items)
这是什么让我有较小的列表清单:
items2 = [['-g', 'abc'], ['-g', 'def'], ['-g', 'tre']]
我明白,这是因为这将是等于说
items2.extend([ ... ] , [ ... ], [ ... ])
有关于此的任何想法?由于
一种方法是使用zip
:
>>> items = ['abc', 'def', 'tre']
>>> zip(['-g', '-g', '-g'], items)
[('-g', 'abc'), ('-g', 'def'), ('-g', 'tre')]
之后,您可以使用itertools.chain
拼合列表:
>>> list(itertools.chain(*zip(['-g', '-g', '-g'], items)))
['-g', 'abc', '-g', 'def', '-g', 'tre']
注意的是,由于函数调用的开销,这是相当缓慢,与简单的列表理解相比:
In [17]: %timeit [j for i in items for j in '-g', i]
1000000 loops, best of 3: 923 ns per loop
In [18]: %timeit list(itertools.chain(*zip(['-g', '-g', '-g'], items)))
100000 loops, best of 3: 2.67 µs per loop
因此对于performa我建议你使用Robᵩ answer。
我不认为这是必需的输出 – 2014-08-27 21:17:46
@PadraicCunningham,更新了我的帖子。 – miku 2014-08-27 21:20:49
为补充其他优秀zip
根据答案,你可能会使用itertools.repeat()
代替“计数”项目:
>>> items = ['abc', 'def', 'tre']
>>> list(itertools.chain(*zip(itertools.repeat('-g'), items)))
# ^^^^^^^^^^^^^^^^^^^^^^
# repeat as much as needed
['-g', 'abc', '-g', 'def', '-g', 'tre']
如果你不喜欢拉链,一种替代方案:
>>> list(itertools.chain(*[('-g', i) for i in items]))
['-g', 'abc', '-g', 'def', '-g', 'tre']
另一种简单的方法是遍历列表并在每个元素之后插入。
for i in range(len(items)):
items.insert((i*2)+1,'-g')
当您插入长度可达插入点双打,所以你需要把你的下一个元素在(I * 2)+1
不性感。不是非常pythonic。但可能很快。我没有时间运行基准测试,但我敢打赌这是最有效率的解决方案。 – 2014-08-27 21:42:14
要扁平化您的列表,就用'itertools.chain( * items2)' – 2014-08-27 21:20:09