Python 创建列表n个列表副本

Python 创建列表n个列表副本,python,list,copy,Python,List,Copy,我需要一个列表列表,手动输入前两个子列表,但第三个直到第五个列表是彼此的副本。我怎样才能把同一份清单写三遍呢?这个例子并不是我想要的,而是生成了第三个子列表,它的长度是我需要的三倍: examplelist=[[1,2],[3,4],3*[5,6,7]] >>>[[1, 2], [3, 4], [5, 6, 7, 5, 6, 7, 5, 6, 7]] 我想: >>>[[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7

我需要一个列表列表,手动输入前两个子列表,但第三个直到第五个列表是彼此的副本。我怎样才能把同一份清单写三遍呢?这个例子并不是我想要的,而是生成了第三个子列表,它的长度是我需要的三倍:

examplelist=[[1,2],[3,4],3*[5,6,7]]
>>>[[1, 2], [3, 4], [5, 6, 7, 5, 6, 7, 5, 6, 7]]
我想:

>>>[[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]

您最好以直截了当的方式执行此操作:

l = [[1, 2], [3, 4]]
l.extend([5, 6, 7] for _ in range(3))
如果将列表列表相乘(
[[5,6,7]]*3==[[5,6,7],[5,6,7],[5,6,7]]
),您将得到对同一列表的三个引用。

有几种方法:

>>> [[1,2],[3,4]] + [[5,6,7]]*3
[[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]

但请注意,列表中的最后3个列表将是相同的:

>>> examplelist[-1][0] = 100
>>> examplelist
[[1, 2], [3, 4], [100, 6, 7], [100, 6, 7], [100, 6, 7]]
可能不是您想要的。

这应该可以:

>>> from itertools import repeat
>>> ex = [ [1,2], [3,4] ]
>>> ex.extend(repeat([5, 6, 7], 3))
>>> ex
>>> [[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]

Python将添加列表以获得您期望的结果:

>>> examplelist=[[1,2],[3,4]]
>>> n=3
>>> examplelist+=[[5,6,7] for i in range(n)]
>>> examplelist
[[1, 2], [3, 4], [5, 6, 7], [5, 6, 7], [5, 6, 7]]
您还可以一次性创建描述的结构,因为表达式是在构建列表时计算的:

>>> li=[[1,2,3]] + [[5,6,7] for i in range(n)] + [[7,8,9]]
>>> li
[[1, 2, 3], [5, 6, 7], [5, 6, 7], [5, 6, 7], [7, 8, 9]]

使用这两个输出中的任何一个,尝试
examplelist[2][1]=9
,看看它能给您带来什么…谢谢,已经知道您正在编辑它。。。但你的方式似乎更好。为什么在它给出所需输出时否决它?这与@mhawke的答案有着相同的问题-你得到了对同一列表对象的三个引用。@jonrsharpe感谢你的有用提示,当只有一个项目被更改时,三个引用实际上会发生变化。不过,我认为他们的尝试已经足够好了。@sweeneyrod看到我对mhawke答案的评论-这不是一个好主意。@jonrsharpe你是对的,但公平地说,OP没有说明这是否重要。@mhawke OP可能不知道这可能是一个问题。对可变对象的多次引用是一个非常常见的Python“gotcha”,它会绊倒许多新用户并导致一些微妙的错误-你的回答至少清楚地表明了这一点。忘了提到我在三个相同的列表之后还有其他列表……但是你的答案与plus结合起来很好!谢谢有趣的是,这节省了多少打字时间?键入完整列表:
len('l=[[1,2],[3,4],[5,6,7],[5,6,7],[5,6,7])
=>53-与len('l=[[1,2],[3,4]);l.extend([5,6,7]表示范围(3)]”=>58.@mhawke在这种情况下几乎没有!但是,它降低了出错的风险(因为您没有多次写出相同的列表)并且可以更好地扩展到更改
n
。请注意,您的第二个版本在
li[1]
中放置了一个列表列表,它们没有按照OP的要求排列。@jonrsharpe:谢谢!修复了。我的睡眠仍然没有恢复!
>>> li=[[1,2,3]] + [[5,6,7] for i in range(n)] + [[7,8,9]]
>>> li
[[1, 2, 3], [5, 6, 7], [5, 6, 7], [5, 6, 7], [7, 8, 9]]