建立重複N次的單個項目的列表

我想建立一系列長度不一的列表。 每一個列表將包含相同的元件e ,重複n次(其中n列表=長度)。 架構

如何建立列表,而不爲每一個列表使用列表[e for number in xrange(n)]app


#1樓

在Python中建立重複n次的單項列表

不變物品

對於不可變的項目,例如「無」,布爾值,整數,浮點數,字符串,元組或Frozensets,能夠這樣進行: 函數

[e] * 4

請注意,這最好只與列表中的不可變項(字符串,元組,frozensets)一塊兒使用,由於它們都指向內存中同一位置的同一項。 當我必須構建一個包含全部字符串的架構的表時,我會常常使用它,這樣就沒必要提供高度冗餘的一對一映射。 性能

schema = ['string'] * len(columns)

可變項

我已經使用Python很長時間了,並且從未見過用可變實例執行上述操做的用例。 相反,要獲取可變的空列表,集合或字典,您應該執行如下操做: 測試

list_of_lists = [[] for _ in columns]

在這種狀況下,下劃線只是一個簡單的變量名。 編碼

若是隻有號碼,那將是: spa

list_of_lists = [[] for _ in range(4)]

_並非很特殊,可是若是您不打算使用變量並使用任何其餘名稱,則您的編碼環境樣式檢查器可能會抱怨。 code


對可變項使用不可變方法的注意事項:

小心使用可變對象 ,當您更改其中一個對象時,它們都會更改,由於它們都是同一對象: 對象

foo = [[]] * 4
foo[0].append('x')

foo如今返回: 內存

[['x'], ['x'], ['x'], ['x']]

可是對於不可變的對象,您可使其起做用,由於您能夠更改引用而不是對象:

>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]

>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]

但一樣,可變對象對此沒有好處,由於就地操做會更改對象,而不是引用:

l = [set()] * 4
>>> l[0] |= set('abc')    
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]

#2樓

正如其餘人指出的那樣,對可變對象使用*運算符會重複引用,所以,若是更改一個,則會所有更改。 若是要建立可變對象的獨立實例,則xrange語法是執行此操做的最Python方式。 若是您有一個從未使用過的命名變量而感到困擾,則可使用匿名下劃線變量。

[e for _ in xrange(n)]

#3樓

Itertools具備此功能:

import itertools
it = itertools.repeat(e,n)

固然, itertools爲您提供了迭代器而不是列表。 [e] * n爲您提供了一個列表,可是,根據對這些序列的處理方式, itertools變體可能會更加高效。


#4樓

您還能夠編寫:

[e] * n

您應該注意,例如,若是e是一個空列表,您將獲得一個具備n個指向同一列表的引用的列表,而不是n個獨立的空列表。

性能測試

乍看之下彷佛重複是建立一個具備n個相同的元素列表的最快方法:

>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819

可是等等-這不是一個公平的測試...

>>> itertools.repeat(0, 10)
repeat(0, 10)  # Not a list!!!

函數itertools.repeat實際上並不建立列表,它只是建立一個對象,您能夠根據須要使用該對象建立列表! 讓咱們再試一次,但轉換爲列表:

>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233

所以,若是須要列表,請使用[e] * n 。 若是要延遲生成元素,請使用repeat


#5樓

>>> [5] * 4
[5, 5, 5, 5]

當重複的項目是列表時,請小心。 該列表將不會被克隆:全部元素都將引用同一列表!

>>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]
相關文章
相關標籤/搜索