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

Den*_*niz 21 python list

假设我有一个给定的对象(一个字符串"a",一个数字 - 让我们说0,或者一个列表['x','y'])

我想创建包含此对象的许多副本的列表,但不使用for循环:

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

要么

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

要么

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

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

Lup*_*uch 41

您可以使用*运营商:

L = ["a"] * 10
L = [0] * 10
L = [["x", "y"]] * 10
Run Code Online (Sandbox Code Playgroud)

小心这创建相同项目的 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']]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可能希望使用列表推导:

L = [["x", "y"] for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

  • +1:作用于列表的*运算符只是为了做原始海报想要的.列表(itertools.repeat())解决方案对于小钉子来说太大了. (3认同)
  • 在最后一种情况下,由于您没有使用变量“i”,所以我认为礼貌的做法是将其命名为“_”,即“L = [['x', 'y'] for _ in range( 10)]`。 (3认同)

Amb*_*ber 30

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']
Run Code Online (Sandbox Code Playgroud)

请注意,在第三种情况下,由于列表是通过引用引用的,因此更改列表中的['x','y']的一个实例将更改所有这些实例,因为它们都引用相同的列表.

为避免引用相同的项,您可以使用理解来为每个列表元素创建新对象:

L = [['x','y'] for i in range(20)]
Run Code Online (Sandbox Code Playgroud)

(对于Python 2.x,请使用xrange()而不是range()性能.)

  • 使用下划线而不是"i"表示它是一个一次性变量是好的做法IMO:`L = [['x','y']为_在范围内(20)]` (6认同)