我想创建一系列长度不同的列表。每个列表将包含相同的元素e,重复n次(其中n =列表的长度)。
我如何创建列表,而不使用列表理解[e为xrange(n)中的数字]为每个列表?
我想创建一系列长度不同的列表。每个列表将包含相同的元素e,重复n次(其中n =列表的长度)。
我如何创建列表,而不使用列表理解[e为xrange(n)中的数字]为每个列表?
当前回答
你也可以这样写:
[e] * n
你应该注意到,如果e是一个空列表,你会得到一个包含n个对相同列表的引用的列表,而不是n个独立的空列表。
性能测试
乍一看,repeat似乎是创建包含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。
其他回答
你也可以这样写:
[e] * n
你应该注意到,如果e是一个空列表,你会得到一个包含n个对相同列表的引用的列表,而不是n个独立的空列表。
性能测试
乍一看,repeat似乎是创建包含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。
[e] * n
应该工作
>>> [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]]
Itertools有一个函数:
import itertools
it = itertools.repeat(e,n)
当然,itertools提供的是迭代器而不是列表。[e] * n给你一个列表,但是,根据你对这些序列做什么,itertools变体可以更有效。
如果你在寻找
[1, 1, 1, 2, 2, 2, 3, 3, 3]
如果没有numpy,可以使用内置的itertools模块
from itertools import chain
list(chain.from_iterable(zip(*[[1,2,3]]*3)))
使用简单的列表推导式(甚至没有itertools)
[e for x in zip(*[[1,2,3]]*3) for e in x]