在Python中单行创建包含多个给定对象副本的列表

34 投票
6 回答
48315 浏览
提问于 2025-04-15 22:27

假设我有一个对象,比如一个字符串“a”,一个数字——我们就说是0,或者一个列表['x','y']

我想创建一个列表,里面包含这个对象的多个副本,但不想使用for循环:

L = ["a", "a", ... , "a", "a"]

或者

L = [0, 0, ... , 0, 0]

或者

L = [['x','y'],['x','y'], ... ,['x','y'],['x','y']]

我特别对第三种情况感兴趣。谢谢!

6 个回答

2

你可以这样做:

x = <your object>
n = <times to be repeated>
L = [x for i in xrange(n)]

在Python 3中,可以用range(n)来替换。

58

你可以使用 * 这个符号:

L = ["a"] * 10
L = [0] * 10
L = [["x", "y"]] * 10

要小心,这样会创建 N 个相同的项目,也就是说在第三种情况下,你会创建一个列表,里面有 N 个指向 ["x", "y"] 列表的引用;比如说,如果你改变了 L[0][0],那么 其他所有的副本也会被修改

>>> L = [["x", "y"]] * 3
>>> L
[['x', 'y'], ['x', 'y'], ['x', 'y']]
>>> L[0][0] = "z"
[['z', 'y'], ['z', 'y'], ['z', 'y']]

在这种情况下,你可能想用列表推导式:

L = [["x", "y"] for i in range(10)]
36

itertools.repeat() 是个很不错的工具。

L = list(itertools.repeat("a", 20)) # 20 copies of "a"

L = list(itertools.repeat(10, 20))  # 20 copies of 10

L = list(itertools.repeat(['x','y'], 20)) # 20 copies of ['x','y']

注意,在第三种情况下,由于列表是通过引用来处理的,修改列表中的一个实例 ['x','y'] 会影响到所有实例,因为它们都指向同一个列表。

为了避免引用同一个项目,你可以使用列表推导式来为每个列表元素创建新的对象:

L = [['x','y'] for i in range(20)]

(对于 Python 2.x,使用 xrange() 代替 range() 可以提高性能。)

撰写回答