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

应该工作

Itertools有一个函数:

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

当然,itertools提供的是迭代器而不是列表。[e] * n给你一个列表,但是,根据你对这些序列做什么,itertools变体可以更有效。

很抱歉我这么晚才回复 您可以使用numpy。容易重复。只要写下你想要产生的价值和重复的次数。

import numpy as np
x = [1,2,3]
y = np.linspace(0,1000,10000)
for i in x:
    new_x = np.repeat(i,len(y))
    print(new_x)

如果你正在寻找一个简单的重复:

[1, 2, 3, 1, 2, 3, 1, 2, 3]

简单的使用方法:

[1, 2, 3] * 3

但如果你在寻找:

[1, 1, 1, 2, 2, 2, 3, 3, 3]

这个比较好,但是比较花时间:

numpy.concatenate([([i]*3) for i in [1,2,3]], axis=0)

正如其他人指出的那样,对可变对象使用*操作符会重复引用,所以如果你改变了一个,你就改变了所有引用。如果想要创建可变对象的独立实例,xrange语法是最python化的方法。如果您对从未使用过的命名变量感到烦恼,则可以使用匿名下划线变量。

[e for _ in xrange(n)]