建立重复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]]
相关文章
相关标签/搜索