我想建立一系列长度不一的列表。 每一个列表将包含相同的元件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]]