在Python中单行创建包含多个给定对象副本的列表
假设我有一个对象,比如一个字符串“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()
可以提高性能。)