2014-08-27 109 views
2

因此,让我们说我有列表 项目 = ['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([ ... ] , [ ... ], [ ... ]) 

有关于此的任何想法?由于

+0

要扁平化您的列表,就用'itertools.chain( * items2)' – 2014-08-27 21:20:09

回答

6
[j for i in items for j in '-g', i] 
+1

谢谢,所有的答案工作,但这一个是最短的:) – AsadSMalik 2014-08-27 21:36:02

3

一种方法是使用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

+3

我不认为这是必需的输出 – 2014-08-27 21:17:46

+0

@PadraicCunningham,更新了我的帖子。 – miku 2014-08-27 21:20:49

2

为补充其他优秀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'] 
1

另一种简单的方法是遍历列表并在每个元素之后插入。

for i in range(len(items)): 
    items.insert((i*2)+1,'-g') 

当您插入长度可达插入点双打,所以你需要把你的下一个元素在(I * 2)+1

+0

不性感。不是非常pythonic。但可能很快。我没有时间运行基准测试,但我敢打赌这是最有效率的解决方案。 – 2014-08-27 21:42:14