operator-overloading - 在python中,创建单个列表项重复n 次

我想创建一系列不同长度的列表,每个列表将包含相同元素e,重复n次(其中,n=列表的长度)。 如何创建列表,而不用


[e for number in xrange(n)]

时间:

你可以编写:

 
[e] *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


>>> [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]]


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

你可以这样做:

 
[e] *4

 

注意,这只在列表中使用不可变项(字符串,元组,frozensets),因为它们都指向内存中相同的位置,当必须构建一个包含所有字符串架构的表时,不得不使用一个映射。


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


警告:

请注意,在更改其中一个对象时,使用可变对象,因为它们都是相同的对象,因为都是:


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'])]

 
[e] *n

 

应该工作

使用*运算符对一个可变对象重复引用,所以如果改变了它们,如果你有一个从未使用过的命名变量,那么可以使用匿名下划线变量。


[e for _ in xrange(n)]

...