2014-08-27 84 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