2017-01-20 47 views
2

假設我有列表列表理解的元素出現兩次

l = ['a', 'c', 'b'] 

什麼,我想就是這些元素出現兩次,一前一後的清單,讓

['a', 'a', 'c', 'c', 'b', 'b'] 

,我想以最可能的pythonic方式做到這一點。

我的一半解決方案做這樣的事情

[[l[i], l[i]] for i in range(len(l))] 

這將產生

[['a', 'a'], ['c', 'c'], ['b', 'b']] 

從這裏,我不得不解析(步行)的列表中刪除內部列表和獲得單一單子列表。

任何人都有更好的想法一次做到這一點?很顯然,像l * 2這樣的東西無助於['a', 'c', 'b', 'a', 'c', 'b'],我想要相鄰的相同元素。

回答

4
l_2 = [item for item in l for i in range(n)] 

鏈接到原點:Stackoverflow: Repeating elements of a list n times

+0

選擇這個,因爲它似乎更優雅的一個。請注意,計時執行此操作會產生1000000個循環,最好是3:1。每個迴路49μs'與@Yousaf的回答相比,它給出了'最慢的運行比最快的運行長5.32倍。這可能意味着正在緩存中間結果。 1000000循環,最好的3:每循環1.12微秒' –

+1

我估計使用更長的列表進行計時。三個要素非常短,時間並不重要。對於上面的代碼,我還得到了'最慢的運行時間比最快的時間長5.41倍'。 – UpSampler

4

只使用list comprehension,你可以這樣做:

[i for j in my_list for i in [j]*2] 

輸出:

>>> my_list = ['a', 'c', 'b'] 
>>> [i for j in my_list for i in [j]*2] 
['a', 'a', 'c', 'c', 'b', 'b'] 
3

可以zip列表針對其自身,然後在列表理解平整。

>>> [i for j in zip(l,l) for i in j] 
['a', 'a', 'c', 'c', 'b', 'b'] 
2

可以使用zip功能

l = ['a', 'c', 'b'] 
a = [i for j in zip(l,l) for i in j] 
print(a) 

輸出

['a', 'a', 'c', 'c', 'b', 'b'] 
1

更普遍的:

def ntimes(iterable, times=2): 
    for elt in iterable: 
     for _ in range(times): 
      yield elt 
1

這裏是沒有列表理解一個簡短的解決方案,採用直觀的想法l*2

sorted(l*2, key=l.index) 
#['a', 'a', 'c', 'c', 'b', 'b'] 
1

如果你喜歡功能性的方法,你可以這樣做:

from itertools import chain, tee 

l = ['a', 'c', 'b'] 
n = 2 

list(chain.from_iterable(zip(*tee(l, n)))) 

雖然這可能無法像其他答案一樣快,但它可以輕鬆地用於任意迭代(特別是在它們正在流行或者當您不知道何時結束時),方法是省略list()

(請注意,一些其他的答案也可以通過由發電機表達式來替換他們的列表理解可以適用於任意iterables。)