我想建立一系列長度不一的列表。 每一個列表將包含相同的元件e
,重複n
次(其中n
列表=長度)。 架構
如何建立列表,而不爲每一個列表使用列表[e for number in xrange(n)]
? app
在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'])]
正如其餘人指出的那樣,對可變對象使用*運算符會重複引用,所以,若是更改一個,則會所有更改。 若是要建立可變對象的獨立實例,則xrange語法是執行此操做的最Python方式。 若是您有一個從未使用過的命名變量而感到困擾,則可使用匿名下劃線變量。
[e for _ in xrange(n)]
Itertools具備此功能:
import itertools it = itertools.repeat(e,n)
固然, itertools
爲您提供了迭代器而不是列表。 [e] * n
爲您提供了一個列表,可是,根據對這些序列的處理方式, itertools
變體可能會更加高效。
您還能夠編寫:
[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] * 4 [5, 5, 5, 5]
當重複的項目是列表時,請小心。 該列表將不會被克隆:全部元素都將引用同一列表!
>>> x=[5] >>> y=[x] * 4 >>> y [[5], [5], [5], [5]] >>> y[0][0] = 6 >>> y [[6], [6], [6], [6]]