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

我如何创建列表,而不使用列表理解[e为xrange(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]]

其他回答

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

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

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

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]

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

[e for _ in xrange(n)]