2016-03-15 41 views

回答

6

這是我簡單的解決方案,如果你要複製的每個元素相同的時間。它返回一個生成器表達式,這應該是內存有效的。

def duplicate(i, n): 
    return (k for k in i for j in range(n)) 

使用示例可以是,

print (list(duplicate(range(1, 10), 3))) 

它打印,

[1,1,1,2,2,2,3,3,3,4, 4,4,5,5,6,6,7,7,7,8,8, 8,9,9,9]

+0

「哪個_is_內存效率高」,實際上因爲表達式不需要相同類型的python命名空間,所以_more_memory高效的生成器函數。 –

+0

什麼是發電機功能? – Muctadir

+0

功能與'yield'聲明一樣在OP –

3
itertools.chain.from_iterable(itertools.izip(*itertools.tee(source, n))) 

例子:

>>> x = (a**2 for a in xrange(5)) 
>>> list(itertools.chain.from_iterable(itertools.izip(*itertools.tee(x, 3)))) 
[0, 0, 0, 1, 1, 1, 4, 4, 4, 9, 9, 9, 16, 16, 16] 

另一種方式:

itertools.chain.from_iterable(itertools.repeat(item, n) for item in source) 

>>> x = (a**2 for a in xrange(5)) 
>>> list(itertools.chain.from_iterable(itertools.repeat(item, 3) for item in x)) 
[0, 0, 0, 1, 1, 1, 4, 4, 4, 9, 9, 9, 16, 16, 16] 
+0

不要將參數出現在'itertools.chain()'中,而是使用'itertools.chain.from_iterable()'代替 – Kevin

+0

@Kevin:好點 – BrenBarn

+0

這是一回事嗎?意思是,根據所討論的功能,他稱呼「重複」功能多次,每個元素使用不同的數字。 – Muctadir

1

用生成器表達式:

>>> x = (n for n in range(4)) 
>>> i = (v for v in x for _ in range(3)) 
>>> list(i) 
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]