我必须生成一个包含非常大的10 ^ 5列表的列表列表,每个列表包含(10 ^ 5)个元素。稍后我需要在不同的列表上执行不同的操作。
例如:
我试过了
<Style/>
当我尝试对特定列表执行操作时,它会影响列表中的所有列表。
例如:
u=[0 for i in xrange(10^^5)]
v=[u for j in xrange(10^^5)]
我希望这个“print v”显示类似for x in xrange(1000):
for y in xrange(0:100):
v[x][y]=1
print v
的内容,但它恰好显示列表中所有列表的[[1,0,0...],[0,0,0...],[0,0,0],[]....10^^5 times]
(注意:我没有运行整个循环)
后来我尝试了
[[1,0,0...],[1,0,0...],[1,0,0],[1,0,0....]....10^^5 times]
并完成了我想要的操作。这个工作正常,但所用的时间非常长。任何人都可以让我知道为什么第一个案例不起作用。另请告诉我生成重复列表列表的有效方法,并在不影响其他列表的情况下执行这些操作
另外,请让我知道使用像numpy这样的库实现它的任何其他方法。
答案 0 :(得分:0)
In [51]: u = [0 for i in range(5)]
In [52]: u
Out[52]: [0, 0, 0, 0, 0]
In [53]: v = [u for j in range(4)]
In [54]: v
Out[54]: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
In [55]: v[0][1]=2
In [56]: v
Out[56]: [[0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0]]
v
有4个元素,每个元素都指向u
。更改一个,它会全部更改,并且也会更改u
。
但如果我使用u[:]
副本制作w
,那么w
的每个子列表都是唯一的。更改一个不会改变其他人,也不会改变u
(或v
):
In [57]: w = [u[:] for j in range(4)]
In [58]: w
Out[58]: [[0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0]]
In [59]: w[0][1]=4
In [60]: w
Out[60]: [[0, 4, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0]]
In [61]: u
Out[61]: [0, 2, 0, 0, 0]
构造w
会更慢,并且会占用更多内存。但它应该比[[0 for i in range(5)] for j in range(4)]
更快,并占用相同的内存量。
测试时间
In [62]: timeit [[0 for i in range(5)] for j in range(4)]
6.42 µs ± 99 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [63]: timeit w = [u[:] for j in range(4)]
2.24 µs ± 84.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [64]: timeit v = [u for j in range(4)]
1.23 µs ± 13.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)